2015-03-16 2 views
4

Я читал ответ за Moxy ignore invalid fields in json, и подход подошел к чему-то, что я пытаюсь сделать, поэтому я решил сделать снимок. Я создал функцию отключения стандартного ConfigurableMoxyJsonProvider;Пользовательские MOXyJsonProvider в Джерси 2 не работают?

@Provider 
public class JsonFeature implements Feature { 
    @Override 
    public boolean configure(final FeatureContext context) { 
     final String disableMoxy = CommonProperties.MOXY_JSON_FEATURE_DISABLE + 
       '.' + 
       context.getConfiguration().getRuntimeType().name().toLowerCase(); 
     context.property(disableMoxy, true); 
     return true; 
    } 
} 

И я создал действительно простой пользовательский поставщик;

@Provider 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public class JsonProvider extends MOXyJsonProvider { 
    @Override 
    protected void preWriteTo(Object object, Class<?> type, Type genericType, 
           Annotation[] annotations, MediaType mediaType, 
           MultivaluedMap<String, Object> httpHeaders, Marshaller marshaller) 
      throws JAXBException { 
     System.out.println("test"); 
    } 

    @Override 
    protected void preReadFrom(Class<Object> type, Type genericType, Annotation[] annotations, 
           MediaType mediaType, MultivaluedMap<String, String> httpHeaders, 
           Unmarshaller unmarshaller) 
      throws JAXBException { 
     System.out.println("test"); 
    } 
} 

Я зарегистрировал оба устройства;

register(JsonFeature.class); 
register(JsonProvider.class); 

И я дал ему шанс с простым запросом GET;

@GET 
@Path("test") 
public String getTest() { 
    return new TestObject(); 
} 

Я считаю, что это должно работать, но ни preWriteTo, ни preReadFrom когда-нибудь ссылаться .. Есть еще один шаг, который я не хватает? Как мне заставить их стрелять?

ответ

3

Выяснил это - для тех, кто наткнулся на него. Правильный способ отключения по умолчанию:

@Provider 
public class JsonFeature implements Feature { 
    @Override 
    public boolean configure(final FeatureContext context) { 
     context.property(CommonProperties.MOXY_JSON_FEATURE_DISABLE_SERVER, true); 
     return true; 
    } 
} 

Затем добавьте ConfigurableMoxyJsonProvider как это;

@Provider 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public class JsonProvider extends ConfigurableMoxyJsonProvider { 
    @Override 
    protected void preWriteTo(Object object, Class<?> type, Type genericType, 
           Annotation[] annotations, MediaType mediaType, 
           MultivaluedMap<String, Object> httpHeaders, Marshaller marshaller) 
      throws JAXBException { 
     System.out.println("test"); 
    } 

    @Override 
    protected void preReadFrom(Class<Object> type, Type genericType, Annotation[] annotations, 
           MediaType mediaType, MultivaluedMap<String, String> httpHeaders, 
           Unmarshaller unmarshaller) 
      throws JAXBException { 
     System.out.println("test"); 
    } 
} 
+2

Спасибо :) Я тоже ударил стену из-за этого. Btw. вам не нужно создавать класс JSONFeature. Вы можете просто установить свойство в свой ResourceConfig 'resourceConfig.property (CommonProperties.MOXY_JSON_FEATURE_DISABLE_SERVER, true)' – Zounadire

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