2014-02-14 3 views
3

У меня есть некоторые методы ресурса jersey, установленные с аннотацией @JsonView, чтобы фильтровать поля, возвращенные в ответе. Я бы хотел, чтобы в некоторых случаях можно было переопределить набор JsonView в аннотации другим или иногда полностью отключить его. (некоторый запросParam будет использоваться для определения того, какой вид должен быть установлен для рендеринга или если он должен быть отключен). Любые идеи?Как переопределить методы @JsonView в ресурсах jersey

+0

Цель состоит в том, чтобы установить jsonview по умолчанию для данного ответа службы отдыха и, если необходимо, переопределить его. –

ответ

2

Вы можете настроить запись объекта Jackson внутри фильтра джерси на основе аннотации метода ресурса, используя the Jackson 2.3 ObjectWriterModifier/ObjectReaderModifier feature.

Обратитесь к the Jersey documentation как определить фильтры и перехватчики. This question может быть полезно для Jersey 1.x.

Ниже приведен пример регистрации локального экземпляра потока объекта ObjectWriterModifier, который изменяет класс представления для поставщика JAX-RS Jackson. Я не тестировал код в отношении реализации JAX-RS, но я считаю, что он должен работать (дайте мне знать, если это не так).

public class JacksonObjectWriterModifier { 

    private static class JsonViewOverrider extends ObjectWriterModifier { 

     private final Class<?> view; 

     private JsonViewOverrider(Class<?> view) { 
      this.view = view; 
     } 

     @Override 
     public ObjectWriter modify(EndpointConfigBase<?> endpoint, MultivaluedMap<String, Object> responseHeaders, 
            Object valueToWrite, ObjectWriter w, JsonGenerator g) throws IOException { 
      return w.withView(view); 
     } 
    } 

    private static class View1 { 
    } 
    private static class View2 { 
    } 

    public static class Bean { 
     @JsonView(View1.class) 
     public final String field1; 
     @JsonView(View2.class) 
     public final String field2; 

     public Bean(String field1, String field2) { 
      this.field1 = field1; 
      this.field2 = field2; 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     Bean b = new Bean("a", "b"); 
     JacksonJsonProvider provider = new JacksonJsonProvider(); 
     provider.setDefaultView(View1.class); 

     // commenting the following line falls back to the View1 
     ObjectWriterInjector.set(new JsonViewOverrider(View2.class)); 

     provider.writeTo(b, Bean.class, null, null, MediaType.APPLICATION_JSON_TYPE, null, System.out); 
    } 
+0

Я еще не пробовал. Приоритеты изменились, но я обещаю дать вам отзыв, как только я получу шанс сделать это. –

+0

@AlexKubity Я обновил свой вопрос - добавлены ссылки на фильтры Джерси. –

Смежные вопросы