2011-12-12 108 views
8

有什麼辦法可以使用傑克遜JSON視圖或類似的東西,而無需註釋原始的bean類?我正在尋找某種運行時/動態配置讓我做類似的事情。使用傑克遜JSON視圖沒有註釋原始bean類

我的豆是一個打包在JAR中的@Entity,可以由多個項目共享。我試圖避免接觸並重新打包共享的JAR,因爲消費項目中的UI更改。

理想我想這樣做

jsonViewBuilder = createViewBuilder(View.class); 
jsonViewBuilder.addProperty("property1"); 
jsonViewBuilder.addProperty("property2"); 

更換

Bean { 
    @JsonView(View.class) 
    String property1; 

    @JsonView(View.class) 
    String property2; 
} 

任何想法?

基礎環境:Spring 3.0,Spring MVC和Glassfish 3.1.1。

回答

12

如何使用混合功能?

http://wiki.fasterxml.com/JacksonMixInAnnotations

http://www.cowtowncoder.com/blog/archives/2009/08/entry_305.html


import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility; 
import org.codehaus.jackson.annotate.JsonMethod; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.SerializationConfig; 
import org.codehaus.jackson.map.annotate.JsonView; 

public class JacksonFoo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY) 
     .configure(SerializationConfig.Feature.DEFAULT_VIEW_INCLUSION, false); 
    mapper.getSerializationConfig().addMixInAnnotations(Bar.class, BarMixIn.class); 
    mapper.setSerializationConfig(mapper.getSerializationConfig().withView(Expose.class)); 

    System.out.println(mapper.writeValueAsString(new Bar())); 
    // output: {"b":"B"} 
    } 
} 

class Bar 
{ 
    String a = "A"; 
    String b = "B"; 
} 

abstract class BarMixIn 
{ 
    @JsonView(Expose.class) 
    String b; 
} 

// Used only as JsonView marker. 
// Could use any existing class, like Object, instead. 
class Expose {} 
+0

我可以用用'@ JsonView'混入註解?這些例子只顯示'@ JsonProperty'。 – wrschneider

+0

是的。以示例更新答案。 –

+0

精美的作品,謝謝!現在,如果只有一種方法來重構該設置,以避免在每個控制器中重複。 – wrschneider