我是 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返回之后,但是在调用函数收到字符串数据列表之前。任何指针都将非常感激。
答案 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配置即可。但通常杰克逊格式比泽西格式更受欢迎。