2011-12-14 39 views
21

我被要求美化來自RestEasy端點的默認傑克遜JSON。我對傑克遜做了一些研究,並編寫了一些獨立的代碼來抑制空值,自定義數據格式等。現在的挑戰是將此代碼注入RestEasy的JSON序列化中。在RestEasy中訪問Jackson對象映射器

從論壇帖子來看,這在Spring中是微不足道的,但在RestEasy中似乎並不是這樣。我編寫了一個ContextResolver,並在web.xml(在Tomcat上)的上下文參數中將其配置爲resteasy.provider,但阻止了webapp在Tomcat上的加載。

現在我試圖擴展javax.ws.rs.core.Application並提供一個ContextResolver,但沒有取得進展。這是直截了當的,有沒有人這樣做?任何幫助是極大的讚賞。

+0

好的,我可以通過編寫一個基於wiki.fasterxml.com/JacksonFAQJaxRs條目的自定義JacksonJsonProvider來完成此操作。代碼如下 - – codegeek 2011-12-17 00:21:11

回答

2

Jackson的供應商ObjectMapper應該是JAX-RS的標準做法(適用於澤西島),所以它似乎也適用於RESTeasy。

+0

感謝您的回覆,您能否詳細說明這一點?如果你可以讓我知道你是如何註冊自定義的objectmapper/serializer/contextresolver等,這將是很好的。 – codegeek 2011-12-15 21:16:29

+0

這會有幫助嗎? http://wiki.fasterxml.com/JacksonFAQJaxRs – StaxMan 2011-12-15 23:51:08

+1

好吧,謝謝我想通了。我與無關的問題作鬥爭,這是直截了當的,我寫了一個自定義的JacksonJsonProvider如下 - – codegeek 2011-12-17 00:16:19

13

好吧,我想通了,我能夠通過基於Jackson FAQ: JAX-RS .The代碼編寫自定義JacksonJsonProvider做到這一點如下:

@Provider 
public class QBOJacksonJsonProvider extends JacksonJsonProvider { 
    public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; 

    @Override 
    public void writeTo(Object value, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String,Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException { 
     Log.info(getClass(), "In custom JSON provider"); 
     //get the Object Mapper 
     ObjectMapper mapper = locateMapper(type, mediaType); 
     // Suppress null properties in JSON output 
     mapper.getSerializationConfig().setSerializationInclusion(org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion.NON_NULL); 
     // Set human readable date format 
     SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT); 
     mapper.getSerializationConfig().setDateFormat(sdf); 

     super.writeTo(value, type, genericType, annotations, mediaType, httpHeaders, entityStream); 
    } 
} 
+9

你是如何「註冊」此提供程序? – 2013-05-02 21:47:04

12

我發現修改傑克遜SerializationConfig的更好的方式 - 您可以使用JAX-RS ContextResolver攔截ObjectMapper的創建。

@Provider 
@Produces(Array(MediaType.APPLICATION_JSON)) 
class JacksonConfig extends ContextResolver[ObjectMapper] { 

    val mapper = new ObjectMapper() 
    mapper.getSerializationConfig.setSerializationInclusion(Inclusion.NON_NULL) 

    def getContext(objectType: Class[_]) = mapper 
} 

您需要在下列方式之一用的RESTEasy註冊:

  • 返回它作爲從javax.ws.rs.core.Application實施
  • 列表中的一個類或實例它作爲提供商resteasy.providers
  • 讓RESTEasy自動掃描您的WAR文件。參見配置指南
  • 通過ResteasyProviderFactory.getInstance()手動添加registerProvider(類)或registerProviderInstance(對象)

參考:RESTEasy docs

參考:Nicklas Karlsson on the JBoss forums

請注意,此作品RESTEasy 2.3.2在JBoss 7.1.1.Final中作爲模塊發佈,但似乎不適用於RESTEasy 3.0-beta5。

1

如果您使用的是Jackson2提供商,您需要做一些與之前的答案略有不同的內容。默認情況下,這個例子將漂亮的打印輸出

@Provider 
public class JSONProvider extends ResteasyJackson2Provider { 

    @Override 
    public void writeTo(Object value, Class<?> type, Type genericType, Annotation[] annotations, MediaType json, MultivaluedMap<String, Object> headers, OutputStream body) throws IOException { 

    ObjectMapper mapper = locateMapper(type, json); 
    mapper.enable(SerializationFeature.INDENT_OUTPUT); 

    super.writeTo(value, type, genericType, annotations, json, headers, body); 
    } 

} 

,並在Web-XML註冊,如果你沒有在autoRegister的,把它添加到您的resteasy.providers的context-param

0

如果您使用傑克遜2.2。X提供商,RestEasy的提供了一個 漂亮打印註釋simliar與一個在JAXB提供:

org.jboss.resteasy.annotations.providers.jackson.Formatted 

下面是一個例子:

@GET 
@Produces("application/json") 
@Path("/formatted/{id}") 
@Formatted 
public Product getFormattedProduct() 
{ 
    return new Product(333, "robot"); 
} 

如上所示,@Formatted註釋將在示例啓用底層傑克遜選項「SerializationFeature.INDENT_OUTPUT」的 。

©RESTEasy User Guide

這不是一個全球性的解決方案,但您也可以將註釋放在類上。

相關問題