Не найден модуль записи тела сообщения для класса Java и медиа-типа MIME text/html

Я использую структуру jms/atmosphere для связи между двумя приложениями. Одно из приложений является производителем сообщений для темы, отправляя пользовательские объекты следующего типа:

    @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, стеклянную рыбу 3.1.1, атмосферу 0.8.1, майку 1.11. Я искал в Интернете, пробовал любое возможное решение, но ничего не помогло.


person mejas    schedule 27.12.2011    source источник


Ответы (2)


У меня была та же проблема, и это было связано с тем, что модуль json Джерси не был включен в мой путь к классам. Вы можете просто исправить это, добавив следующую зависимость от maven

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.14</version>
</dependency>
person techarch    schedule 14.09.2012
comment
Я добавил зависимость jersey-json, но проблема осталась прежней. - person TOUDIdel; 09.03.2013
comment
Эти зависимости необходимы, когда вы хотите создать json, но OP хочет html - person rds; 03.05.2013
comment
битая ссылка, исправьте пожалуйста? - person Mohamed Taher Alrefaie; 01.07.2013

Кажется, вам нужно реализовать требуемый MessageBodyWriter для классов, которые вы транспортируете через Джерси.

Вы можете прикрепить @Provider к классу A и реализовать MessageBodyWriter, например:

Открытый класс @Provider A реализует MessageBodyWriter

Это заставит вас переопределить необходимые методы (writeTo, getSize, isWriteable), пока трикотаж переносит объекты в ваших методах.

person anilsinaci    schedule 27.12.2011
comment
Это не работает. Я реализую MessageBodyWriter непосредственно перед подпиской и переопределяю методы, но они никогда не вызываются. - person mejas; 27.12.2011
comment
Вы зарегистрировали свой MessageBodyWriter в приложении (javax.ws.rs.core.Application)? Пока трикотаж инициируется, метод Application.getClasses() возвращает набор классов, и провайдеры (такие как MessageBodyWriters) должны быть возвращены в этом наборе. - person anilsinaci; 27.12.2011