MOXyJsonProvider 不工作
MOXyJsonProvider not working
在我的 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; }
}
我指的是这个 thread 中的标记答案。当我尝试访问“/helloworld”时,它会抛出以下异常:
org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: Could not initialize class org.eclipse.persistence.jaxb.BeanValidationHelper
如果资源只是 returns 一个字符串,则此应用程序可以正常工作。 web.xml 文件中没有任何内容,因为我让 Glassfish 通过其装饰器设置应用程序。
知道我在这里遗漏了什么吗?
我最终按照@peeskillet 建议的方向解决了问题。 不需要 MOXyJsonProvider。
一个难以解决的问题是,几乎所有网络上的示例都假定您正在使用 web.xml 文件配置 Servlet,而我不是.我所做的所有配置都来自 Application 对象。 Jersey 文档并没有说得很清楚。最终起作用的是:
@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,无需任何努力。
我不会只删除这个问题,而是将这个答案放在这里,希望能为别人节省我花在寻找这个问题上的时间。
在我的 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; }
}
我指的是这个 thread 中的标记答案。当我尝试访问“/helloworld”时,它会抛出以下异常:
org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: Could not initialize class org.eclipse.persistence.jaxb.BeanValidationHelper
如果资源只是 returns 一个字符串,则此应用程序可以正常工作。 web.xml 文件中没有任何内容,因为我让 Glassfish 通过其装饰器设置应用程序。
知道我在这里遗漏了什么吗?
我最终按照@peeskillet 建议的方向解决了问题。 不需要 MOXyJsonProvider。
一个难以解决的问题是,几乎所有网络上的示例都假定您正在使用 web.xml 文件配置 Servlet,而我不是.我所做的所有配置都来自 Application 对象。 Jersey 文档并没有说得很清楚。最终起作用的是:
@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,无需任何努力。
我不会只删除这个问题,而是将这个答案放在这里,希望能为别人节省我花在寻找这个问题上的时间。