2013-05-04 49 views
11

我正在使用Jersey JAX-RS客戶端(版本2.0)。我知道它使用Jackson ObjectMapper來生成和解析JSON。我想用同一個對象爲一些java類生成JSON,以便我可以將它們寫入日誌。如何從JAX-RS客戶端提取ObjectMapper?

我知道我可以創建ObjectMapper的新實例,但我更願意要求Jersey客戶端給我它使用的是一個參考。我怎樣才能做到這一點? Jersey 2.0意識到Jackson,因爲它包含一個JacksonFeature類,用於首先配置Jackson功能。

回答

18

我通過添加下面的靜態成員解決了這個t配置FAIL_ON_UNKNOWN_PROPERTIESFAIL_ON_EMPTY_BEANS;由於其他原因,我使用object_mapper

+0

如果你只有'client',你怎麼能從'client'中提取'objectMapper'? – DerekY 2015-07-28 04:58:08

+0

@DerekY我不知道該怎麼做。 – necromancer 2015-08-12 06:32:13

17

新澤西實際上並沒有明確的配置ObjectMapper實例,而是委託給JacksonJsonProvider,這反過來使用默認映射器實例。你可以通過the JacksonProviderProxy code來追蹤它的工作原理。您可以創建和自定義共享映射器被定義整個應用程序中使用的context resolver

@Provider 
public class ObjectMapperContextResolver implements 
     ContextResolver<ObjectMapper> { 
    private ObjectMapper mapper = null; 

    public ObjectMapperContextResolver() { 
     super(); 

     // Illustrate configuration of the mapper instance 
     mapper = new ObjectMapper().configure(
       SerializationConfig.Feature.WRAP_ROOT_VALUE, true).configure(
       DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, true); 
    } 

    @Override 
    public ObjectMapper getContext(Class<?> type) { 
     return mapper; 
    } 
} 

傑克遜提供商將從該解析器檢索其映射器實例,你可以做同樣的在你的代碼,所以:

private static JacksonJsonProvider jackson_json_provider = new JacksonJaxbJsonProvider() 
     .configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false) 
     .configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false); 

private static ObjectMapper object_mapper = jackson_json_provider.locateMapper(
     Object.class, MediaType.APPLICATION_JSON_TYPE); 

private static Client client = ClientBuilder.newClient().register(jackson_json_provider); 

注意,第二個聲明是不需要強制:

public class MyResource { 
    @Context 
    private ContextResolver<ObjectMapper> mapperResolver; 

    public void someResourceMethod() { 
     final ObjectMapper mapper = mapperResolver.getContext(Object.class); 
    } 
} 
+0

謝謝。這與我的3行代碼相比如何:'private static JacksonJsonProvider ...'(作爲註釋不能清晰,因此我已將它添加爲答案) – necromancer 2013-05-05 23:37:44

+2

另外,看着依賴注入我不知道你的方法是否適用於澤西客戶端?或只有球衣服務器? – necromancer 2013-05-05 23:44:54

+1

@necromancer客戶端客戶端= ClientBuilder.newClient(); client.register(ObjectMapperContextResolver.class);' – Martin 2016-07-13 14:20:08

0

無法得到的球衣對象映射器進行配置,根據這裏的其他解決方案(使用傑克遜2.8.3)。 (我懷疑它可能與osgi容器有關,但儘管如此...)圍繞它的強力方法是從客戶端獲取Response對象並在其上調用您自己的ObjectMapper實例。然後,同樣的實例可以在其他地方的顯式配置中重用。

Client client = ClientBuilder.newClient(); 
ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
... 
Response r = client.target(URL).request().get(); 
MyDtoClass dto = mapper.readValue((InputStream)(r.getEntity()), MyDtoClass.class);