2013-11-20 23 views
2

現狀如何在沒有任何註釋的情況下在Spring項目中使用Jackson Json解析?

我有一個枚舉類稱爲錯誤,它是在一個共同的項目。錯誤枚舉包含一個int代碼和一個String文本。 Errors枚舉用於兩個不同的項目。一個項目是基於Spring的項目,另一個項目是在非Spring的J2EE應用程序中。

在基於Spring的項目中,Jackson是用於將Errors枚舉轉換爲Json的庫。所以,如果有一個要求,我們可以返回一個錯誤枚舉對象,它會被自動轉換爲JSON表示,它是{代碼:int,文本:error}的錯誤枚舉具有註解:

@JsonSerialize(using=ErrorsSerializer.class) 

的ErrorsSerializer類位於基於Spring的應用程序中。

在Errors枚舉所在的常用項目中,Gson是用於將對象轉換爲Json表示的庫,我們希望刪除對Jackson庫的所有引用。

問題

如果我刪除從錯誤註釋枚舉的Spring項目將不會返回錯誤枚舉的正確表示,它只會在引號返回常數變量。

問題

如何刪除的錯誤枚舉的註釋(這將刪除在公共項目中的任何傑克遜的依賴關係),但仍然有Spring項目返回正確的JSON表示?

最好的選擇到目前爲止

最好的辦法我都拿出了迄今爲止是建立在包含錯誤枚舉Spring應用程序的錯誤容器對象,也有JSON序列化註解。

謝謝!

+0

到目前爲止您的最佳選擇是最佳選擇。既然它是一個枚舉,你不能擴展它,所以一個包裝對象是唯一的選擇。 – Taylor

回答

2

您還可以使用Module功能在基於Spring的項目中指定串行器。 Module允許用戶自定義ObjectMapper沒有註釋的對象。見下面的例子:

import java.io.IOException; 

import com.fasterxml.jackson.core.JsonGenerator; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.JsonSerializer; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.SerializerProvider; 
import com.fasterxml.jackson.databind.module.SimpleModule; 

public class JacksonProgram { 

    public static void main(String[] args) throws Exception { 
     SimpleModule module = new SimpleModule(); 
     module.addSerializer(Error.class, new ErrorJsonSerializer()); 

     ObjectMapper mapper = new ObjectMapper(); 
     mapper.registerModule(module); 

     System.out.println(mapper.writeValueAsString(Error.NOT_FOUND)); 
    } 
} 

上面的例子打印:

{"code":1,"text":"Not found"} 

見下面的鏈接找到的解決方案如何在Spring應用程序配置ObjectMapper

+0

每當我想要發回json表示時,我都必須調用mapper.writeValueAsString,對吧?反正有沒有像@JsonSerialize那樣自動化?並讓控制器方法發送一個錯誤枚舉而不是一個字符串? –

+0

Spring自動創建ObjectMapper實例並使用它將對象序列化爲JSON。您必須創建自己的ObjectMapper類,並告訴Spring使用您的自定義OM而不是默認的OM。上面的源代碼僅僅是一個例子,它表明上面的解決方案適用於'Enum's。 –

+0

那麼上例中的哪一行告訴spring使用自定義OM? –

相關問題