2011-12-12 41 views
8

Có cách nào để tôi có thể sử dụng Chế độ xem JSON JSON hay thứ gì đó tương tự, mà không cần phải chú thích lớp bean gốc? Tôi đang tìm một số loại cấu hình thời gian chạy/động để cho phép tôi làm điều tương tự.Sử dụng Chế độ xem JSON JSON mà không chú thích lớp bean gốc

Đậu của tôi là @Entity được đóng gói trong một JAR có thể được chia sẻ bởi nhiều dự án. Tôi đang cố gắng tránh chạm và đóng gói lại JAR được chia sẻ vì thay đổi giao diện người dùng trong các dự án tiêu thụ.

Lý tưởng nhất là tôi muốn làm điều gì đó như

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

để thay thế

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

    @JsonView(View.class) 
    String property2; 
} 

Bất kỳ ý tưởng?

Môi trường bên dưới: Spring 3.0, Spring MVC và Glassfish 3.1.1.

Trả lời

12

Cách sử dụng tính năng Kết hợp?

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

tôi có thể sử dụng chú thích mixin với '@ JsonView'? các ví dụ chỉ hiển thị '@ JsonProperty'. – wrschneider

+0

Có. Cập nhật câu trả lời với ví dụ. –

+0

Hoạt động đẹp, cảm ơn! Bây giờ nếu chỉ có một cách để cấu trúc lại công cụ thiết lập đó để tránh lặp lại trong mọi bộ điều khiển. – wrschneider

Các vấn đề liên quan