【问题标题】:A message body writer for Java class ... and MIME media type text/html was not found [duplicate]未找到 Java 类的消息正文编写器 ...和 ​​MIME 媒体类型 text/html [重复]
【发布时间】:2012-01-28 13:29:05
【问题描述】:

我正在使用 jms/atmosphere 框架在两个应用程序之间进行通信。 其中一个应用程序是主题的消息生产者,发送以下类型的自定义对象:

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

    /* some private properties */

   }

另一方面,不止一个消费者正在监听该主题,并根据 ID 进行不同的订阅。

    @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。我在网上搜索并尝试了任何可能的解决方案,但没有任何帮助。

【问题讨论】:

    标签: java json glassfish jersey atmosphere


    【解决方案1】:

    我遇到了同样的问题,原因是我的类路径中没有包含 Jersey 的 json 模块。您可以通过在 maven 上添加以下依赖项来简单地修复它

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

    【讨论】:

    • 我添加了 jersey-json 依赖,但问题还是一样。
    • 当你想生成json时需要这个依赖,但是OP想要html
    • 链接断开,请修复?
    【解决方案2】:

    看来您需要为通过泽西岛传输的类实现所需的 MessageBodyWriter。

    您可以将@Provider附加到类A,并使其实现MessageBodyWriter,例如:

    @Provider 公共类A实现MessageBodyWriter

    这将迫使您在 jersey 传输方法中的对象时覆盖所需的方法(writeTo、getSize、isWriteable)。

    【讨论】:

    • 这不起作用。我在订阅之前直接实现 MessageBodyWriter 并覆盖这些方法,但它们从未被调用。
    • 您是否已将 MessageBodyWriter 注册到 Application (javax.ws.rs.core.Application)?在 jersey 初始化时,Application.getClasses() 方法返回一组类,并且应该在该组中返回 Providers(如 MessageBodyWriters)。
    猜你喜欢
    • 2013-03-15
    • 2012-08-16
    • 2016-10-01
    • 2018-01-26
    • 2018-04-20
    • 2013-12-05
    • 2011-12-11
    • 2014-03-20
    • 2016-06-14
    相关资源
    最近更新 更多