未找到Java类...和MIME媒体类型text/html的消息正文作者
问题描述:
我正在使用jms /氛围框架在两个应用程序之间进行通信。 的应用之一是一个主题消息生产者,发送以下类型的自定义对象:未找到Java类...和MIME媒体类型text/html的消息正文作者
@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的GlassFish,气氛0.8.1,运动衫1.11。我在网上搜索了任何可能的解决方案,但没有任何帮助。
答
看来您需要为通过Jersey传输的类实现所需的MessageBodyWriter。
您可以将@Provider A类,并使其实现MessageBodyWriter如:
@Provider 公共类A实现MessageBodyWriter
这将迫使你重写所需的方法(的writeTo,的getSize ,isWriteable),而运动衫正在运送方法中的物体。
答
我有同样的问题,并没有泽西的JSON模块包含在我的类路径。您可以简单地通过在maven上添加以下依赖项来修复它:
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.14</version>
</dependency>
这并不奏效。我在订阅之前直接实现了MessageBodyWriter,并且我重写了这些方法,但是它们从不被调用。 – mejas 2011-12-27 15:44:15
您是否已将MessageBodyWriter注册到应用程序(javax.ws.rs.core.Application)?在启动泽西时,Application.getClasses()方法返回一组类,并且提供者(例如MessageBodyWriters)应该返回到此集合中。 – anilsinaci 2011-12-27 16:07:09