当我尝试使用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
这就是我调用假设返回视图的函数
@GET
@Path("/list")
@Produces(MediaType.TEXT_HTML)
public TicketView listTickets() {
return new TicketView();
}
这是我的TicketView类的简单版本
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>
有谁知道我做错了什么?或者至少帮助我走上正确的道路。
答案 0 :(得分:1)
我的问题的解决方案如下。正如Peeskillet上面提到的那样。我忘记在我的应用程序类中添加viewbundle
@Override
public void initialize(Bootstrap<SupportServerConfiguration> bootstrap) {
bootstrap.addBundle(new ViewBundle());
}
这解决了我的问题
答案 1 :(得分:0)
在Jersey应用程序配置中的某个位置,您应该注册特殊功能以启用HTML正文编写器。 如果你有java base config,它看起来类似于:
public class RestApplication extends ResourceConfig {
public RestApplication() {
packages("lv.autentica");
// registering JSON support
register(JacksonFeature.class);
}
}
不幸的是,我不知道Html支持的确切功能是如何命名的。 您应该检查是否确实需要返回HTML作为响应。使用泽西时,这看起来很奇怪。
答案 2 :(得分:0)
您需要为com.linker.views.TicketView类实现消息体编写器类,如下所示:
@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”方法中做什么。您可能还需要实现消息体读取器类。看看this link!