代码之家  ›  专栏  ›  技术社区  ›  Jemil Riahi

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

  •  1
  • Jemil Riahi  · 技术社区  · 9 年前

    我在尝试使用DropWizard和视图时遇到了问题。

        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 回复  |  直到 9 年前
        1
  •  1
  •   Jemil Riahi    9 年前

    我的问题的解决方案如下。如上文所述。我忘了加 viewbundle 在我的应用程序类上

      @Override
      public void initialize(Bootstrap<SupportServerConfiguration> bootstrap) {
        bootstrap.addBundle(new ViewBundle());
      }
    

    这解决了我的问题

        2
  •  0
  •   Arthur Eirich    9 年前

    您需要为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!

        3
  •  0
  •   Arthur Eirich    9 年前

    在Jersey应用程序配置的某个地方,您应该注册特殊功能以启用HTML正文编写器。 如果您有java基本配置,它看起来可能类似于:

    public class RestApplication extends ResourceConfig {
        public RestApplication() {
            packages("lv.autentica");
    
            // registering JSON support
            register(JacksonFeature.class);
        }
    }
    

    不幸的是,我不知道Html支持的功能是如何命名的。 您应该检查是否确实需要返回HTML作为响应。使用Jersey时,这看起来很奇怪。