2011-12-27 2 views
15

私は、2つのアプリケーション間の通信を行うためにjms/atmosphereフレームワークを使用しています。複数の消費者が話題に耳を傾け、IDに応じて、異なるサブスクリプションを作成している他の側ではJavaクラス...およびMIMEメディアタイプtext/htmlのメッセージ本文ライターが見つかりません

@XmlRootElement 
    public class A implements Serializable{ 
    public A(){} 

    /* some private properties */ 

    } 

: アプリケーションの1つが次のタイプのカスタムオブジェクトを送信し、トピックのメッセージプロデューサです。

SEVERE: A message body writer for Java class A, and Java type class A, and MIME  
    media type text/html was not found 

    SEVERE: The registered message body writers compatible with the MIME media type are: 

    */* -> 
    com.sun.jersey.core.impl.provider.entity.FormProvider 
    com.sun.jersey.core.impl.provider.entity.MimeMultipartProvider 
    com.sun.jersey.core.impl.provider.entity.StringProvider 
    com.sun.jersey.core.impl.provider.entity.ByteArrayProvider 
    com.sun.jersey.core.impl.provider.entity.FileProvider 
    com.sun.jersey.core.impl.provider.entity.InputStreamProvider 
    com.sun.jersey.core.impl.provider.entity.DataSourceProvider 
    com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General 
    com.sun.jersey.core.impl.provider.entity.ReaderProvider 
    com.sun.jersey.core.impl.provider.entity.DocumentProvider 
    com.sun.jersey.core.impl.provider.entity.StreamingOutputProvider 
    com.sun.jersey.core.impl.provider.entity.SourceProvider$SourceWriter 
    com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General 
    com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$General 
    com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$General 
    com.sun.jersey.json.impl.provider.entity.JSONWithPaddingProvider 
    com.sun.jersey.server.impl.template.ViewableMessageBodyWriter 
    com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General 
    com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General 
    com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General 
    com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General 
    com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy 
    com.sun.jersey.moxy.MoxyMessageBodyWorker 
    com.sun.jersey.moxy.MoxyListMessageBodyWorker 

私は、NetBeans 7.0.1、GlassFishの3.1.1を使用しています、雰囲気:私はメッセージはJMSトピックに正しく到着しているが、私は次の例外を受け取ることである気づく何

@GET 
    @Produces({MediaType.APPLICATION_JSON}) 
    public SuspendResponse<A> subscribe() { 
    return new SuspendResponse.SuspendResponseBuilder<A>() 
      .broadcaster(topic) 
      .outputComments(true) 
      .addListener(new EventsLogger()).build(); 
    } 
    @Override 
public void incomingBroadcast() { 
    try { 
     String id = getID(); 
     if (id.startsWith("/*")) { 
      id = "atmosphere"; 
     } 

     logger.info("Looking up Connection Factory {}", FACTORY_NAME); 
     Context ctx = new InitialContext(); 
     ConnectionFactory connectionFactory = (ConnectionFactory) ctx.lookup(FACTORY_NAME); 

     logger.info("Looking up topic: {}", TOPIC_NAME); 
     Topic topic = (Topic) ctx.lookup(TOPIC_NAME); 

     connection = connectionFactory.createConnection(); 
     session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 

     logger.info("Create consumer for : {}", id); 
     String selector = String.format("BroadcasterId = '%s'", id); 

     consumer = session.createConsumer(topic, selector); 
     consumer.setMessageListener(new MessageListener() { 

      @Override 
      public void onMessage(Message msg) { 
       try { 
        ObjectMessage om = (ObjectMessage) msg; 
        A a = (A) om.getObject(); 
        if (a!= null && bc != null) { 
         broadcastReceivedMessage(a); 
        } 
        logger.info("Broadcasted message: {} ", a); 
       } catch (JMSException ex) { 
        logger.warn("Failed to broadcast message", ex); 
       } 
      } 
     }); 
     publisher = session.createProducer(topic); 
     connection.start(); 
     logger.info("JMS created for topic {}, with filter {}", TOPIC_NAME, selector); 
    } catch (Throwable ex) { 
     throw new IllegalStateException("Unable to initialize MyBroadcaster", ex); 
    } 

} 

0.8.1、ジャージー1.11。私は可能な解決策を試みたウェブを検索したが、何も助けなかった。

答えて

0

Jerseyを経由して輸送するクラスには、必要なMessageBodyWriterを実装する必要があるようです。

あなたはクラスAに@Provider取り付け、それを実装することができますMessageBodyWriterなど:

パブリッククラスAはMessageBodyWriter

を実装@Providerこれは、必要なメソッド(のwriteTo、のgetSizeをオーバーライドすることを強制されます、isWriteable)、ジャージーはメソッドのオブジェクトをトランポートします。

+0

これはうまくいきません。購読する前に直接MessageBodyWriterを実装し、メソッドをオーバーライドしますが、呼び出されることはありません。 – mejas

+0

MessageBodyWriterをApplication(javax.ws.rs.core.Application)に登録しましたか?ジャージが開始されている間、Application.getClasses()メソッドは一連のクラスを返し、プロバイダ(MessageBodyWritersなど)をこのセットに返す必要があります。 – anilsinaci

8

私は同じ問題があり、クラスパスにJerseyのjsonモジュールが含まれていないことが原因でした。あなたは単にMavenに以下の依存関係を加えて修正することができます

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-json</artifactId> 
    <version>1.14</version> 
</dependency> 
+8

jersey-json依存関係を追加しましたが、問題は同じです。 – TOUDIdel

+1

この依存関係はjsonを生成したいときに必要ですが、OPはHTML – rds

+2

が壊れたリンクを希望していますか、pleasEを修正しますか? –

関連する問題