2011-12-12 107 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