gpt4 book ai didi

java - JAX-RS Jersey 客户端使用 POJO MAPPING 和 Jackson 编码 JSON 响应

转载 作者:搜寻专家 更新时间:2023-10-31 19:57:12 28 4
gpt4 key购买 nike

我在使用 Jersey 客户端 (1.11) 并将 JSONConfiguration.FEATURE_POJO_MAPPING 设置为 true 时遇到一些问题。我的测试代码如下所示:

MyFooCollectionWrapper<MyFooDTO> resp
= webResource.accept(MediaType.APPLICATION_JSON)
.get(new GenericType<MyFooCollectionWrapper<MyFooDTO>>() {});

在服务器上:

1) 我的 web.xml 将 POJO 映射设置为 true。

2) MyFooDTO 只是一个看起来像这样的 POJO:

public class MyFooDTO {

private long id;
private String propA;

pubic long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}

pubic String getPropA() {
return propA;
}
public void setPropA(String propA) {
this.propA = propA;
}

public MyFooDTO(MyFoo aFoo) {
this.id = aFoo.getId();
this.propA = aFoo.getPropA();
}

public MyFooDTO() {}

}

3) MyFooCollectionWrapper 看起来像这样:

public class MyFooCollectionWrapper<T> extends MyFooCollectionWrapperBase {

Collection<T> aCollection;

public MyFooCollectionWrapper() {
super();
}

public MyFooCollectionWrapper(boolean isOK, String msg, Collection<T> col) {
super(isOK, msg);
this.aCollection = col;
}

public void setCollection(Collection<T> collection) {
this.aCollection = collection;
}

@JsonProperty("values")
public Collection<T> getCollection() {
return aCollection;
}
}

public class MyFooCollectionWrapperBase {

private boolean isOK;
private String message;

public MyFooCollectionWrapperBase() {
this.message = "";
this.isOK = false;
}

public MyFooCollectionWrapperBase(boolean ok, String msg) {
this.isOK = ok;
this.message = msg;
}

.. standard getter/setters ..

}

我已验证服务器在创建 Json 响应时没有问题。如果我将响应类型设置为字符串,我可以使用我的 Jersey 客户端代码进行检索。当我使用

MyFooCollectionWrapper<MyFooDTO> resp = webResource.accept(MediaType.APPLICATION_JSON).get(new GenericType<MyFooCollectionWrapper<MyFooDTO>>() {});

我希望 POJO 映射能够正常工作(编码响应)而无需自定义消息正文阅读器。但是,我得到:

Jun 04, 2012 3:02:20 PM com.sun.jersey.api.client.ClientResponse getEntity
SEVERE: A message body reader for Java class com.foo.MyFooCollectionWrapper, and Java type com.foo. MyFooCollectionWrapper<com.foo.MyFooDTO>, and MIME media type application/json was not found
Jun 04, 2012 3:02:20 PM com.sun.jersey.api.client.ClientResponse getEntity
SEVERE: The registered message body readers 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.SourceProvider$StreamSourceReader
com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader
com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader
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.core.impl.provider.entity.XMLRootElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General
com.sun.jersey.core.impl.provider.entity.EntityHolderReader
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
com.sun.jersey.moxy.MoxyMessageBodyWorker
com.sun.jersey.moxy.MoxyListMessageBodyWorker


com.sun.jersey.api.client.ClientHandlerException: A message body reader for Java class com.foo.MyFooCollectionWrapper, and Java type com.foo. MyFooCollectionWrapper<com.foo. MyFooDTO>, and MIME media type application/json was not found
at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:550)
at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:524)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:686)
at com.sun.jersey.api.client.WebResource.access$300(WebResource.java:74)
at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:508)

客户端测试的类路径包括:

jersey-test-framework-core-1.11.jar 
jersey-test-framework-embedded-glassfish-1.11.jar
jersey-test-framework-grizzly-1.11.jar
jersey-test-framework-http-1.11.jar
jersey-test-framework-inmemory-1.11.jar
jackson-core-asl.jar
jackson-jaxrs.jar
jackson-xc.jar
jackson-client.jar
jersey-client.jar
jersey-core.jar
jersey-json.jar
jettison.jar

我的期望是错误的还是我遗漏了一些明显的东西?

作为旁注,如果我将 JAXB 注释添加到我的实体(MyFooCollectionWrapper 和 MyFooDTO 上的@XmlRootElement)并使用相同的 webResource get 调用,我的客户端不会收到消息正文读取器异常,但是,响应已编码这样 MyFooCollectionWrapper 看起来没问题,但它的集合不包含 MyFooDTO 它包含一个 XML 文档,在节点/属性中具有正确的值 - 换句话说,MyFooDTP 不会被编码。

当按照 Answer 中的建议将 java.util.logging 设置为 CONFIG 时,我看到了以下内容,尽管我没有想到什么。这是一个 link由于长度,我放在 pastebin 上的输出。

谢谢,

-诺亚

更新 - 已解决

最初我的客户端和客户端配置是这样创建的:

Client rootClient = new Client();
ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
Client client = new Client(rootClient, clientConfig);

当我把它改成简单的时候

    ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
Client client = Client.create(clientConfig);

一切顺利。看起来 rootClient 覆盖了新客户端上的 clientConfig。奇怪的是,当您使用指定 ClientConfig 的构造函数时,ClientConfig 会被 rootClients 配置覆盖。

最佳答案

要在客户端启用 POJO 映射,只需执行以下操作:

ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
Client client = Client.create(clientConfig);

关于java - JAX-RS Jersey 客户端使用 POJO MAPPING 和 Jackson 编码 JSON 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10924984/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com