2014-01-30 42 views
3

我有一個我正在使用Jersey客戶端進行反序列化的類。這個類有一個看起來像這樣的方法:如何告訴Jersey客戶端在它反序列化的每個類上執行相同的@JsonIgnoreProperties(ignoreUnknown = true)?

public boolean isEmpty() { 
    return (code == null && 
      label == null && 
      codeSystem == null && 
      codeSystemLabel == null && 
      description == null && 
      concept == null && 
      alternateCode == null 
    ); 

沒有setter。 AS-的是,這將拋出此異常:

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: [email protected]7d51; 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)

問題是我有很多方法拋出這個異常。有沒有辦法將澤西客戶端配置爲像每個班級設置@JsonIgnoreProperties(ignoreUnknown = true)一樣行動,因此我不必親自對它們加註釋?我不想通過手動添加此註釋來更改〜30個文件。如果有人在沒有setter的情況下添加getter,這將防止將來出現這樣的錯誤。

下面是我如何創建我的球衣客戶:

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

我覺得這樣的clientConfig可能有一個設置要做到這一點,但我不知道如何找到它。

回答

6

您需要通過實例化並配置JacksonJsonProvider來配置Jersey Client

新澤西2.x版:

JacksonJsonProvider jacksonJsonProvider = 
    new JacksonJaxbJsonProvider() 
     .configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

client.register(jacksonJsonProvider); 

新澤西1.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()方法被忽略的序列化?

+0

其實我也希望它在JSON。這個'空'字段將使用不同語言的人不必像我的模型那樣編寫自己的'isEmpty()'實現。 –

+0

順便提一句,'register'方法在我的'Client'上不存在(也許這是一個球衣2.0的東西?)你知道如何在球衣1.x中設置嗎? –

+0

@tieTYT Yikes,對不起...我沒有看到這是Jersey 1.x.等等,不幸的是稍微複雜一些;編輯 –

-1

在客戶端使用REST服務我遇到了同樣的問題。這是我的修復程序:

1)將com.fasterxml.jackson.jaxrs添加到您的POM中,或將該jar包括在您的項目中。

2)修改ClientConfig:從@sleske

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);   
+1

這不起作用,它沒有任何意義。你創建一個'JacksonJsonProvider'的實例,但是從來沒有使用它,除了調用'getClass()'。 – sleske

4

接受響應,因爲我使用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); 

乾杯!

0

你也可以構造你的自定義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); 

有了這個行家依賴

<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

相關問題