2014-04-19 21 views
5

szukam możliwości serializacji przemijające informacje tylko w niektórych przypadkach:Jackson: ignorować getter, ale nie z @JsonView

@JsonInclude(Include.NON_NULL) 
@Entity 
public class User { 

    public static interface AdminView {} 

    ... id, email and others ... 

    @Transient 
    private transient Details details; 

    @JsonIgnore     // Goal: ignore all the time, except next line 
    @JsonView(AdminView.class) // Goal: don't ignore in AdminView 
    public Details getDetails() { 
     if (details == null) { 
      details = ... compute Details ... 
     } 
     return details; 
    } 
} 

public class UserDetailsAction { 
    private static final ObjectWriter writer = new ObjectMapper(); 
    private static final ObjectWriter writerAdmin = writer 
     .writerWithView(User.AdminView.class); 

    public String getUserAsJson(User user) { 
     return writer.writeValueAsString(user); 
    } 

    public String getUserAsJsonForAdmin(User user) { 
     return writerAdmin.writeValueAsString(user); 
    } 
} 

Jeśli zadzwonię getUserAsJson Spodziewałem się zobaczyć id, poczty elektronicznej i innych dziedzinach, ale nie szczegóły. To działa dobrze. Ale widzę to samo dla getUserAsJsonForAdmin, również bez szczegółów. Jeśli usunę adnotację @JsonIgnore - widzę szczegóły w obu połączeniach.

Co jest nie tak i czy istnieje dobry sposób na odejście? Dzięki!

Odpowiedz

4

można znaleźć korzystanie z the dynamic Jackson filtering nieco bardziej eleganckie w przypadku użycia . Oto przykład z filtrowaniem pól POJO oparciu o dzielenie zwyczaj adnotacja jedną instancję obiektu odwzorowujący:

public class JacksonFilter { 
    static private boolean shouldIncludeAllFields; 

    @Retention(RetentionPolicy.RUNTIME) 
    public static @interface Admin {} 

    @JsonFilter("admin-filter") 
    public static class User { 
     public final String email; 
     @Admin 
     public final String details; 

     public User(String email, String details) { 
      this.email = email; 
      this.details = details; 
     } 
    } 

    public static class AdminPropertyFilter extends SimpleBeanPropertyFilter { 

     @Override 
     protected boolean include(BeanPropertyWriter writer) { 
      // deprecated since 2.3 
      return true; 
     } 

     @Override 
     protected boolean include(PropertyWriter writer) { 
      if (writer instanceof BeanPropertyWriter) { 
       return shouldIncludeAllFields || ((BeanPropertyWriter) writer).getAnnotation(Admin.class) == null; 
      } 
      return true; 
     } 
    } 

    public static void main(String[] args) throws JsonProcessingException { 
     User user = new User("email", "secret"); 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.setFilters(new SimpleFilterProvider().addFilter("admin-filter", new AdminPropertyFilter())); 
     System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(user)); 
     shouldIncludeAllFields = true; 
     System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(user)); 
    } 

} 

wyjściowa:

{ 
    "email" : "email" 
} 
{ 
    "email" : "email", 
    "details" : "secret" 
} 
+0

Dziękuję za dobry przykład! –

+0

OK, po przetestowaniu różnych rozwiązań, niestandardowy filtr i FilterIntrospector wydaje się być sposobem, w jaki chcę pójść. –

+0

Dla każdego, kto używa tego kodu w wątkach, istnieje potencjalny problem z współbieżnością przy użyciu opcji shouldIncludeAllFields. Ale łatwo naprawić, tworząc tylko 2 ObjectMappers, 1 z filtrem i 1 bez. ObjectMappers to Threadsafe – muttonUp

0

Wygląda na to, że jackson ma okropną koncepcję na bardzo fajnej funkcji, takiej jak @JsonView. Jedyny sposób, jaki odkryłem, aby rozwiązać mój problem, to:

Może to pomoże ktoś. Ale mam nadzieję znaleźć lepsze rozwiązanie i dlatego, że nie akceptuję własnej odpowiedzi.

EDIT: ponieważ interfejs CAN rozciąga (wiele) interfejsy, mogę użyć:

public static interface AdminView extends BasicView {} 

i tylko

@JsonView(BasicView.class) 

zamiast

@JsonView({BasicView.class, AdminView.class}) 
Powiązane problemy