2011-12-27 12 views
15

मैं दो अनुप्रयोगों के बीच संचार करने के लिए जेएम/वायुमंडल ढांचे का उपयोग कर रहा हूं।जावा क्लास के लिए एक संदेश बॉडी लेखक ... और एमआईएम मीडिया प्रकार टेक्स्ट/एचटीएमएल

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

    /* some private properties */ 

    } 

दूसरी तरफ एक से अधिक उपभोक्ताओं विषय पर सुनने और आईडी के आधार पर अलग सदस्यता बनाने के कर रहे हैं पर: आवेदनों की एक एक विषय के लिए एक संदेश निर्माता, निम्न प्रकार के कस्टम वस्तुओं भेज रहे हैं।

@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); 
    } 

} 

क्या मैं देखा कि संदेशों JMS विषय पर सही ढंग से आ रहे है, लेकिन मैं निम्न अपवाद प्राप्त करते हैं:

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, माहौल 0.8.1, जर्सी 1.11। मैंने वेब की खोज की किसी भी संभावित समाधान की कोशिश की लेकिन कुछ भी मदद नहीं की।

उत्तर

0

ऐसा लगता है कि आपको जर्सी के माध्यम से आपके परिवहन के लिए आवश्यक संदेशबॉडीवाइटर को लागू करने की आवश्यकता है।

आप वर्ग एक के लिए @Provider संलग्न कर सकते हैं, और यह इस तरह के रूप MessageBodyWriter लागू करता है:

@Provider सार्वजनिक वर्ग एक MessageBodyWriter

लागू करता

यह आवश्यक तरीकों (writeTo, getSize ओवरराइड करने के लिए आप के लिए बाध्य करेगा , isWriteable) जबकि जर्सी आपके तरीकों में वस्तुओं को tranporting है।

+0

पर निम्नलिखित निर्भरता जोड़कर बस इसे ठीक कर सकते हैं। यह काम नहीं करता है। मैं सब्सक्राइब करने से पहले संदेशबॉडीवाइटर को सीधे लागू करता हूं और मैं विधियों को ओवरराइड करता हूं, लेकिन उन्हें कभी भी नहीं बुलाया जाता है। – mejas

+0

क्या आपने अपना संदेशबॉडीवाइटर एप्लिकेशन (javax.ws.rs.core.Aplication) पर पंजीकृत किया है? जबकि जर्सी शुरू हो रही है, Application.getClasses() विधि कक्षाओं और प्रदाताओं (जैसे संदेशबॉडी राइटर्स) का एक सेट देता है इस सेट में वापस किया जाना चाहिए। – anilsinaci

8

मेरे पास एक ही समस्या थी और यह मेरे क्लासपाथ पर जर्सी के जेसन मॉड्यूल को शामिल करने के लिए नीचे था। आप इसे मेवेन

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

मैंने जर्सी-जेसन निर्भरता को जोड़ा है लेकिन समस्या अभी भी वही है। – TOUDIdel

+1

जब आप जेसन का उत्पादन करना चाहते हैं तो यह निर्भरता आवश्यक है, लेकिन ओपी चाहता है कि एचटीएमएल – rds

+2

टूटी हुई लिंक, pleasE को ठीक करें? –

संबंधित मुद्दे