我看到错误:Java类java.util.ArrayList的消息体编写器和Java类型java.util.List <java.lang.string>

时间:2015-08-20 23:41:36

标签: java api jersey

我是 Java 的新手,所以我正在努力学习。我正在调试别人的代码,我正在深入了解如何调试问题。

我有代码:

protected List<String> getAllStringData(CRUDRequestWrapper user) {
    final WebResource resource = WsUtils.getLocalWebResource(session);

    List<String> response = resource.path("path/to/api")
                .entity(user, MediaType.APPLICATION_JSON_TYPE)
                .accept(MediaType.APPLICATION_JSON_TYPE)
                .post(new GenericType<List<String>>() { });
    return response; // This line IS NEVER reached
}

进入并触发对代码的API调用:

@POST
@Path("path/to/api")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public GenericEntity<List<String>> getAllStringDataApi(CRUDRequestWrapper wrapper) {    

    List<String> joinedFavorites = getAllStringDataAsList();
    return new GenericEntity<List<String>>(joinedFavorites) {}; // This line IS reached.

}

此API代码执行并完成(据我所知),但是,返回后,我得到一个500并将调试信息打印到控制台:

SEVERE: A message body writer for Java class java.util.ArrayList, and Java type java.util.List<java.lang.String>, and MIME media type application/json was not found
Aug 20, 2015 7:28:25 PM com.sun.jersey.spi.container.ContainerResponse write
SEVERE: The registered message body writers compatible with the MIME media type are:
application/json ->
  com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App
  com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$App
  com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$App
  com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App
  com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App
*/* ->
  com.sun.jersey.core.impl.provider.entity.FormProvider
  com.sun.jersey.core.impl.provider.entity.MimeMultipartProvider
  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.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONWithPaddingProvider
  com.sun.jersey.server.impl.template.ViewableMessageBodyWriter
  com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
  com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General
  com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy

问题是我不知道这意味着什么。我已经看到了其他一些SO(here,事实上我用相同的错误信息实现了GenericType回答建议的问题),但似乎没有提供足够的细节来说明我应该寻找什么

有没有人知道如何开始调试这个? 我认为这个问题是在API返回之后,但是在调用函数收到字符串数据列表之前。任何指针都将非常感激。

1 个答案:

答案 0 :(得分:2)

我在错误消息中看到了JSON提供程序,因此您似乎拥有button.setOnAction(event -> button.getScene().setRoot(FXMLLoader.load(getClass().getResource("view/bambam")))); 依赖项。但似乎(根据我测试的)内部泽西岛提供商并不知道如何处理标量值列表。为此,您需要确保启用Jackson。您只需在web.xml中配置jersey-json

即可
POJOMappingFeature

如果您使用的是<init-param> <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param> 子类,则可以执行

ResourceConfig

有一点需要注意的是内部泽西岛提供商处理JSON的方式与杰克逊处理它的方式不同。例如,Jersey将包装JSON的根值(可能不需要seen here),而Jackson默认不会。

如果您已经习惯了Jersey提供程序的默认设置,并希望保留格式,那么您只需稍微调整一下Jackson配置即可。但通常杰克逊格式比泽西格式更受欢迎。