com.sun.jersey.spi.container.ContainerResponse:Java类的消息体编写器

时间:2015-01-30 13:29:19

标签: java jersey dropwizard

当我尝试使用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>

有谁知道我做错了什么?或者至少帮助我走上正确的道路。

3 个答案:

答案 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!