我有一个类,我正在使用Jersey客户端进行反序列化。这个类有一个如下所示的方法:
public boolean isEmpty() {
return (code == null &&
label == null &&
codeSystem == null &&
codeSystemLabel == null &&
description == null &&
concept == null &&
alternateCode == null
);
没有二传手。原样,这将抛出此异常:
com.sun.jersey.api.client.ClientHandlerException: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "empty" (Class com.app.models.CodedElementModel), not marked as ignorable
at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@3b927d51; line: 1, column: 270] (through reference chain: com.app.models.LabOrderModel["code"]->com.app.models.CodedElementModel["empty"])
I've read this article,事实证明我可以通过在CodedElementModel
类上添加此注释来解决此问题:@JsonIgnoreProperties(ignoreUnknown = true)
。
问题是我有很多方法抛出这个异常。有没有办法配置Jersey客户端,就像在每个类上设置@JsonIgnoreProperties(ignoreUnknown = true)
一样,所以我不必手动注释它们?我不想通过手动添加此注释来更改~30个文件。如果有人在没有setter的情况下添加getter,这将在将来防止此类错误。
以下是我创建Jersey客户端的方法:
DefaultClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
Client client = Client.create(clientConfig);
我觉得clientConfig
可能有设置来执行此操作,但我不确定如何找到它。
答案 0 :(得分:8)
您需要通过为泽西JacksonJsonProvider
实例化和配置Client
来配置此功能。
Jersey V2.x:
JacksonJsonProvider jacksonJsonProvider =
new JacksonJaxbJsonProvider()
.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
client.register(jacksonJsonProvider);
Jersey V1.x:
DefaultClientConfig clientConfig = new DefaultClientConfig();
JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider().
configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
clientConfig.getSingletons().add(jacksonJsonProvider);
值得注意的是,潜在的问题是你的JSON包含字段“空”......我假设它已经到了那里,因为你正在序列化相同的POJO。如果您真的不希望它在JSON中更好地注释isEmpty()
方法被忽略的序列化会不会更好?
答案 1 :(得分:4)
来自@sleske的接受回复,因为我正在使用com.sun.jersey.api.client.Client和com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider而无法解决这个问题。实际上对我有用的是
ClientConfig config = new DefaultClientConfig();
JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
config.getSingletons().add(jacksonJsonProvider);
Client client = Client.create(config);
干杯!
答案 2 :(得分:1)
您还可以构建自定义ObjectMapper并使用它传递它。
ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
final JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider(mapper, JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS).configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
final Client client = ClientBuilder.newClient().register(jacksonJsonProvider);
使用此maven依赖
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.22.1</version>
</dependency>
如此处https://jersey.java.net/documentation/latest/migration.html#mig-1-x-json
所述答案 3 :(得分:-1)
在客户端使用REST服务我遇到了同样的问题。这是我的修复:
1)将com.fasterxml.jackson.jaxrs
添加到您的POM或将jar包含在您的项目中。
2)修改ClientConfig:
JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider();
jacksonJsonProvider.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
clientConfig.getClasses().add(jacksonJsonProvider.getClass());
Client client = Client.create(clientConfig);