com.sun.jersey.spi.container.ContainerResponse:Java class 的消息正文编写器
com.sun.jersey.spi.container.ContainerResponse: A message body writer for Java class
我在尝试使用 DropWizard 和 Views 时遇到问题。
com.sun.jersey.spi.container.ContainerResponse: A message body writer for Java class com.linker.views.TicketView, and Java type class com.linker.views.TicketView, and MIME media type text/html was not found.
The registered message body writers compatible with the MIME media type are:
*/* ->
com.sun.jersey.core.impl.provider.entity.FormProvider
com.sun.jersey.server.impl.template.ViewableMessageBodyWriter
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.fasterxml.jackson.jaxrs.json.JacksonJsonProvider
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
这就是我调用函数的方式 return 我的观点
@GET
@Path("/list")
@Produces(MediaType.TEXT_HTML)
public TicketView listTickets() {
return new TicketView();
}
这是我的 TicketView 的简单版本 class
public class TicketView extends View {
public TicketView(){
super("test.ftl");
}
}
最后这是我受影响的 Maven 依赖项(我认为)
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-multipart</artifactId>
<version>1.18.3</version>
</dependency>
有谁知道我做错了什么?或者至少帮助我走上正确的道路。
在您的 Jersey 应用程序配置中的某处,您应该注册特殊功能以启用 HTML 正文编写器。
如果您有 java 基本配置,它可能类似于:
public class RestApplication extends ResourceConfig {
public RestApplication() {
packages("lv.autentica");
// registering JSON support
register(JacksonFeature.class);
}
}
遗憾的是,我不知道 Html 支持的功能究竟是如何命名的。
你应该检查你是否真的需要 return 一个 HTML 作为回应。这在使用 Jersey 时看起来很奇怪。
您需要为您的 com.linker.views.TicketView class 实现消息正文编写器 class,如下所示:
@Provider
@Produces({MediaType.TEXT_HTML})
public TicketViewWriter implements MessageBodyWriter<TicketView> {
@Override
public boolean isWriteable(
final Class<?> type, final Type genericType, final Annotation[] annotations, final MediaType mediaType
) {
return (
mediaType.isCompatible(MediaType.valueOf(MediaType.TEXT_HTML))
) && TicketView.class.isAssignableFrom(type);
}
@Override
public long getSize(
final TicketView view, final Class<?> type, final Type genericType, final Annotation[] annotations,
final MediaType mediaType
) {
return -1;
}
@Override
public void writeTo(
final TicketView view, final Class<?> type, final Type genericType, final Annotation[] annotations,
final MediaType mediaType, final MultivaluedMap<String, Object> httpHeaders, final OutputStream entityStream
) throws IOException {
try {
// your logic here
} catch (Exception e) {
//log exception
}
}
}
这只是示例,在"writeTo"方法中做什么由您决定。您可能还必须实现消息正文 reader class。看看this link!
我的问题的解决方案如下。正如上面提到的Peeskillet。我忘了在我的申请中添加 viewbundle
class
@Override
public void initialize(Bootstrap<SupportServerConfiguration> bootstrap) {
bootstrap.addBundle(new ViewBundle());
}
这解决了我的问题
我在尝试使用 DropWizard 和 Views 时遇到问题。
com.sun.jersey.spi.container.ContainerResponse: A message body writer for Java class com.linker.views.TicketView, and Java type class com.linker.views.TicketView, and MIME media type text/html was not found.
The registered message body writers compatible with the MIME media type are:
*/* ->
com.sun.jersey.core.impl.provider.entity.FormProvider
com.sun.jersey.server.impl.template.ViewableMessageBodyWriter
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.fasterxml.jackson.jaxrs.json.JacksonJsonProvider
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
这就是我调用函数的方式 return 我的观点
@GET
@Path("/list")
@Produces(MediaType.TEXT_HTML)
public TicketView listTickets() {
return new TicketView();
}
这是我的 TicketView 的简单版本 class
public class TicketView extends View {
public TicketView(){
super("test.ftl");
}
}
最后这是我受影响的 Maven 依赖项(我认为)
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-multipart</artifactId>
<version>1.18.3</version>
</dependency>
有谁知道我做错了什么?或者至少帮助我走上正确的道路。
在您的 Jersey 应用程序配置中的某处,您应该注册特殊功能以启用 HTML 正文编写器。 如果您有 java 基本配置,它可能类似于:
public class RestApplication extends ResourceConfig {
public RestApplication() {
packages("lv.autentica");
// registering JSON support
register(JacksonFeature.class);
}
}
遗憾的是,我不知道 Html 支持的功能究竟是如何命名的。 你应该检查你是否真的需要 return 一个 HTML 作为回应。这在使用 Jersey 时看起来很奇怪。
您需要为您的 com.linker.views.TicketView class 实现消息正文编写器 class,如下所示:
@Provider
@Produces({MediaType.TEXT_HTML})
public TicketViewWriter implements MessageBodyWriter<TicketView> {
@Override
public boolean isWriteable(
final Class<?> type, final Type genericType, final Annotation[] annotations, final MediaType mediaType
) {
return (
mediaType.isCompatible(MediaType.valueOf(MediaType.TEXT_HTML))
) && TicketView.class.isAssignableFrom(type);
}
@Override
public long getSize(
final TicketView view, final Class<?> type, final Type genericType, final Annotation[] annotations,
final MediaType mediaType
) {
return -1;
}
@Override
public void writeTo(
final TicketView view, final Class<?> type, final Type genericType, final Annotation[] annotations,
final MediaType mediaType, final MultivaluedMap<String, Object> httpHeaders, final OutputStream entityStream
) throws IOException {
try {
// your logic here
} catch (Exception e) {
//log exception
}
}
}
这只是示例,在"writeTo"方法中做什么由您决定。您可能还必须实现消息正文 reader class。看看this link!
我的问题的解决方案如下。正如上面提到的Peeskillet。我忘了在我的申请中添加 viewbundle
class
@Override
public void initialize(Bootstrap<SupportServerConfiguration> bootstrap) {
bootstrap.addBundle(new ViewBundle());
}
这解决了我的问题