2015-04-08 2 views
3

Я пишу приложение Jax-RS с использованием Джерси и Jackson2 под капотом для облегчения ввода/вывода JSON. Сама услуга отлично работает, но я бы хотел ее улучшить, если картостроитель Джексона автоматически выполняет сериализацию/десериализацию даты и времени на объекты JodaTime.Зарегистрировать JodaModule в приложении Jax-RS

Я после документации here и добавил соответствующие банки, но я потерял на этой инструкции:

Registering module 

To use Joda datatypes with Jackson, you will first need to register the module first (same as with all Jackson datatype modules): 

ObjectMapper mapper = new ObjectMapper(); 
mapper.registerModule(new JodaModule()); 

Я попытался сделать это в пользовательском классе, который расширяет jax.ws .rs.core.Application, но я не совсем уверен в этом решении. В настоящее время я получаю эту ошибку:

Can not instantiate value of type [simple type, class org.joda.time.DateTime] from String value ('2014-10-22'); no single-String constructor/factory method 
at [Source: org.glassfish.jersey.me[email protected]3471b6d5; line: 7, column: 25] 

Другого, чем общее впечатление, что этот модуль регистрация должна произойти при применении (? Сервлет) запуск, я понятия не имею, что делать с этой информацией. Нужно ли мне комментировать пользовательский класс с чем-то, в частности, чтобы его подхватили? Должен ли я распространять некоторый класс?

Примеры, которые я нахожу в StackOverflow, обычно вставляют его в main() и вызывают непосредственно транслятор, но я полагаюсь на Jackson Databinding, поэтому примеры не актуальны. Любое направление приветствуется.

ответ

4

В основном вы хотите создать/настроить/вернуть ObjectMapper в ContextResolver. Что-то вроде

@Provider 
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> { 

    final ObjectMapper mapper = new ObjectMapper(); 

    public ObjectMapperContextResolver() { 
     mapper.registerModule(new JodaModule()); 
    } 

    @Override 
    public ObjectMapper getContext(Class<?> type) { 
     return mapper; 
    } 
} 

Если вы используете сканирование пакета, чтобы открыть свои ресурсы, то @Provider аннотаций должны позволить этому классу, чтобы быть обнаружена и зарегистрирован также.

В основном то, что происходит, является MessageBodyReader и MessageBodyWriter при условии Джексона, используется для немаршалинга и сортировочного, соответственно, будет вызывать метод getContext в ContextResolver, чтобы определить ObjectMapper использовать. Читатель/писатель будет проходить в классе (в читателе это будет тип, ожидаемый в параметре метода, в записи он будет типом, возвращаемым как-в/в-ответ), что означает, что нам разрешено использовать по-другому настроен ObjectMapper для разных классов, как seen here. В приведенном выше решении он используется для всех классов.

+0

Отлично! Именно то, что мне нужно. – JHarnach

+0

Как я могу достичь этого с помощью JAX-RS-клиента? –

+0

@ thomas.mc.work он должен работать точно так же для клиента. Вы можете явно зарегистрировать его, если по какой-то причине он не получает автоматически –