MOXyJsonProvider не работает

В моих приложениях REST (в GlassFish 4.1.2) я хочу преобразовать POJO в JSON и обратно. Все примеры упрощают задачу, но мне чего-то не хватает.

Вот мое приложение:

@ApplicationPath("/")
public class RootApp extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        HashSet set = new HashSet<Class<?>>();
        set.add(HelloWorld.class);
        return set;
    }

    @Override
    public Set<Object> getSingletons() {
        HashSet set = new HashSet<Object>();

        MOXyJsonProvider moxyJsonProvider = new MOXyJsonProvider();
        moxyJsonProvider.setFormattedOutput(true);
        set.add(moxyJsonProvider);

        return set;
    }
}

А вот и Ресурс:

@Path("helloworld")
public class HelloWorld {

    private static int counter = 1;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getInevitableMessage() {    
        JsonHello hj = new JsonHello("Hello World", counter++);    
        return Response.ok(hj).build();
    }    
}

И наконец, POJO для преобразования в JSON и из него:

public class JsonHello {

    private int count;
    private String message;

    public JsonHello(String message, int count) {
        this.message = message;
        this.count = count;
    }

    public int count() { return count; }
    public void count(int value) { count = value; }

    public String message() { return message; }
    public void message(String value) { message = value; }
}

Я имею в виду ответ с тегами в этой ветке. Когда я пытаюсь получить доступ к "/ helloworld", возникает следующее исключение:

org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: Could not initialize class org.eclipse.persistence.jaxb.BeanValidationHelper

Это приложение работает, если ресурс просто возвращает строку. В файле web.xml ничего нет, поскольку я разрешаю Glassfish устанавливать приложение через его декораторы.

Любая идея, что мне здесь не хватает?


person AlanObject    schedule 08.04.2017    source источник
comment
Как вы справляетесь с зависимостями? Maven? Если да, то какие зависимости вы используете? Добавление банок вручную? Если да, то какие банки вы используете? Какие версии вы используете? Какую версию Glassfish вы используете? Пожалуйста, ответьте на каждый из этих вопросов и отредактируйте свой пост (не в комментариях)   -  person Paul Samsotha    schedule 09.04.2017
comment
@peeskillet Этот проект был создан с помощью Idea 2017.1 и использует GlassFish 4.1.2. Он использует систему сборки IDE, а не Ant или Maven. Библиотеки импортируются вручную, и я использую Jackson 2.8.4. Я не знаю, как сообщить IDE, что библиотека предоставляется (т.е. уже является частью GlassFish), а не упакована вместе с приложением, и это может быть проблемой.   -  person AlanObject    schedule 09.04.2017
comment
Если вы используете Jackson, то зачем вы пытаетесь зарегистрировать MOXy?   -  person Paul Samsotha    schedule 09.04.2017
comment
Проверьте это out. Переключите версии Джерси на версию Джерси, которую вы используете, и переключите банки Джексона на версию Джексона, которую вы хотите использовать. Затем зарегистрируйте JacksonFeature вместо провайдера MOXy.   -  person Paul Samsotha    schedule 09.04.2017
comment
@peeskillet Я попал в MOXy, потому что меня смущает документация и статьи в блогах, например, здесь: stackoverflow.com/questions/17568469/ - однако мне действительно не нужно использовать Джексон, я просто хочу POJO ‹-› JSON с минимумом суеты. Я попробую ваше предложение.   -  person AlanObject    schedule 09.04.2017


Ответы (1)


В итоге я решил проблему, используя направление, предложенное @peeskillet. MOXyJsonProvider не нужен.

Одна проблема, которую трудно решить, заключается в том, что почти все примеры в Интернете предполагают, что вы настраиваете свой сервлет с файлом web.xml, а я не так. Все, что я делаю, - это внутри объекта Приложение. В документации Джерси это не очень ясно. Что в итоге работает, так это:

@Override
public Set<Class<?>> getClasses() {
    HashSet set = new HashSet<Class<?>>();
    set.add(JacksonFeature.class);
    set.add(MyObjectMapperProvider.class);
    set.add(Home.class);
    set.add(HelloWorld.class);
    return set;
}

На этом этапе ресурсы REST могут создавать и использовать различные POJO, которые отлично и без каких-либо усилий транскодируются в JSON.

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

person AlanObject    schedule 10.04.2017