【发布时间】:2015-01-07 06:40:57
【问题描述】:
我从 Java EE 6 升级到 Java EE 7,我的一些 REST 服务停止工作。缩小范围来看,这种变化似乎是在 Jersey 从 Jackson 切换到 Java EE 7 中的 MOXy 时发生的。
我的服务看起来像:
@Stateless
@Path("access")
public class AccessFacadeREST extends AbstractFacade<Access> {
@PersistenceContext(unitName = "AccessServerPU")
private EntityManager em;
public AccessFacadeREST() {
super(Access.class);
}
@POST
@Consumes({"application/xml", "application/json"})
@Produces({"application/xml", "application/json"})
public ObjectResponse create(@Context HttpServletRequest requestContext,
@Context SecurityContext context,
ObjectRequest<Access> req) {
req.setHostname(requestContext.getRemoteAddr());
return AccessValidation.create(em, req);
}
}
这里req 为空,因此在使用JSON 呈现时会生成NullPointerException。当以 XML 形式呈现时,它可以正常工作。 ObjectRequest 是一个通用类,我用它来包装请求,其中包含针对几种不同类型请求的身份验证内容标准。
我测试了一个类似的@GET 服务以返回一个充满垃圾数据的ObjectRequest<Access> 实例。它在使用 XML 时再次运行良好,但在我尝试返回 JSON 时返回null(没有引发异常)。
我发现Java EE7 REST server no longer returning List as JSON 有助于理解潜在问题,但不知道如何在我的情况下让它发挥作用。我的ApplicationConfig 类看起来像:
@javax.ws.rs.ApplicationPath("webresources")
public class ApplicationConfig extends Application {
@Override
public Set<Object> getSingletons() {
Set<Object> set = new HashSet<>();
log.info("Enabling custom Jackson JSON provider");
set.add(new JacksonJsonProvider());
return set;
}
@Override
public Map<String, Object> getProperties() {
Map<String, Object> map = new HashMap<>();
log.info("Disabling MOXy JSON provider");
map.put("jersey.config.disableMoxyJson.server", true);
return map;
}
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new java.util.HashSet<>();
addRestResourceClasses(resources);
return resources;
}
private void addRestResourceClasses(Set<Class<?>> resources) {
resources.add(AccessFacadeREST.class);
}
}
我认为我需要配置 ApplicationConfig 类以使用 Jackson,但我不知道如何概括我找到的解决方案来涵盖我的情况。所以,真的有两个问题:
- 我是否正确地将潜在问题描述为 MOXy 的某种缺陷?
- 如何使用 MOXy 或 Jackson 解决此问题(我没有偏好,只要它有效)?
设置:
- Netbeans 8.0.2
- Glassfish 4.1
- JDK 8 / JRE 8U25(64 位)
编辑以回答以下问题...
项目pom.xml 有以下条目:
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.4.4</version>
</dependency>
【问题讨论】:
-
您是否使用
<groupId>com.fasterxml.jackson.jaxrs</groupId>组下的fasterxml jackson json 提供程序?我记得当我在 Jersey 版本之间迁移时遇到过类似的问题,但那是很久以前的事了。细节让我无法理解。 -
@DeepakBala 请参见上面的编辑,但简而言之,是的,我在项目的 pom.xml 文件中有该条目。
标签: java json jackson moxy java-ee-7