【问题标题】:MOXyJsonProvider not workingMOXyJsonProvider 不工作
【发布时间】:2017-09-04 04:40:59
【问题描述】:

在我的 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();
    }    
}

最后也是最不重要的是要与 JSON 相互转换的 POJO:

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; }
}

我指的是thread 中的标记答案。当我尝试访问“/helloworld”时,它会抛出以下异常:

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

如果资源只返回一个字符串,这个应用程序就可以工作。 web.xml 文件中没有任何内容,因为我让 Glassfish 通过其装饰器设置应用程序。

知道我在这里缺少什么吗?

【问题讨论】:

  • 你是如何处理依赖关系的?马文?如果是这样,您使用的是什么依赖项?手动添加罐子?如果是这样,你用的是什么罐子?你用的是什么版本?您使用的是哪个版本的 Glassfish?请回答每一个问题,并编辑您的帖子(不在 cmets 中)
  • @peeskillet 该项目由 Idea 2017.1 生成,并使用 GlassFish 4.1.2。它使用 IDE 的构建系统——不是 Ant 或 Maven。这些库是手动导入的,我使用的是 Jackson 2.8.4。我不知道如何告诉 IDE 库是“提供的”(即已经是 GlassFish 的一部分)而不是与应用程序一起打包,这可能是个问题。
  • 如果您使用的是 Jackson,那么您为什么要尝试注册 MOXy?
  • 检查this out。将 Jersey 版本切换到您正在使用的 Jersey 版本,并将 Jackson jar 切换到您要使用的 Jackson 版本。然后注册 JacksonFeature 而不是 MOXy 提供程序。
  • @peeskillet 我进入 MOXy 是因为我对这里的文档和博客文章感到困惑:stackoverflow.com/questions/17568469/… -- 但是我真的不必使用 Jackson 我只想要 POJOJSON用最少的大惊小怪。我会试试你的建议。

标签: jersey jersey-2.0 glassfish-4 moxy


【解决方案1】:

我最终按照@peeskillet 建议的方向解决了这个问题。 MOXyJsonProvider 是不需要的。

一个难以解决的问题是,网络上的几乎所有示例都假设您正在使用 web.xml 文件配置 Servlet,而我不是。我所做的所有配置都来自 Application 对象。泽西岛的文档并没有说得很清楚。最终的工作是这样的:

@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,这些 POJO 可以完美地转码为 JSON,无需任何努力。

我将把这个答案放在这里,而不是仅仅删除这个问题,希望能节省我花在发现这个问题上的时间。

【讨论】:

    猜你喜欢
    • 2015-05-18
    • 2021-01-10
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 2018-12-22
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多