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());
  }

这解决了我的问题