Java EE7 REST服务器不再返回List< String>作为JSON [英] Java EE7 REST server no longer returning List<String> as JSON

查看:139
本文介绍了Java EE7 REST服务器不再返回List< String>作为JSON的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下示例在我的Java EE6(Glassfish3)项目中有效,但在切换到Java EE7(Glassfish4)后失败. HTTP请求返回"500 Internal Error",而Glassfish服务器日志中没有任何消息.该项目是使用NetBeans8作为Maven Web Project设置的,没有特殊的依赖关系,beans.xml或其他配置.

The following example works in a Java EE6 (Glassfish3) project of mine but failed after I switched to Java EE7 (Glassfish4). The HTTP request returns "500 Internal Error" without any message in the Glassfish server log. The project was setup using NetBeans8 as Maven Web Project and has no special dependencies, beans.xml or other configuration.

@RequestScoped
@Path("generic")
public class GenericResource {

    @GET
    @Path("ping")
    @Produces(APPLICATION_JSON)
    public List<String> debugPing() {
        return Arrays.asList("pong");
    }

然后:

$ curl -v  http://localhost:8080/mavenproject2/webresources/generic/ping
> GET /mavenproject2/webresources/generic/ping HTTP/1.1
...
< HTTP/1.1 500 Internal Server Error

据我了解,所有REST处理都是由Jackson参考实现完成的,并且Jackson使用Jersey作为底层JSON库.两者中的一个应该为所有基本数据类型提供某种提供程序.只有定制类需要自写的ObjectMapper.这些概念仍然正确吗?

As as I understand, all REST handling is done by the Jackson reference implementation and that Jackson uses Jersey as underlaying JSON library. One of the two is supposed to have some kind of provider for all basic data types. Only custom made classes need a self written ObjectMapper. Are these concepts still correct?

推荐答案

我花了几个小时,但最终我自己解决了这个问题. 第一个事实是,Glassfish4 JAX-RS实现"Jersey"将其基础JSON库从Jackson 1.x切换到Eclipselink MOXy.后者似乎无法立即将列表,数组和任意POJO转换为JSON.因此,我试图强制JAX-RS使用Jackson 2.x并禁用MOXy.

It took me some hours but I finally solved this question myself. First fact is that the Glassfish4 JAX-RS implementation "Jersey" as switched its underlying JSON library from Jackson 1.x to Eclipselink MOXy. The latter seems not be able to convert Lists, Arrays and arbitrary POJOs to JSON out of the box. Therefore I tried to force JAX-RS to use Jackson 2.x and disable MOXy.

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

// This is Jackson 2.x, Jackson 1.x used org.codehaus.jackson!
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ApplicationPath("rest")
public class RestConfig extends Application {

    private final static Logger log = LoggerFactory.getLogger(RestConfig.class);

    @Override
    public Set<Object> getSingletons() {
        Set<Object> set = new HashSet<>();
        log.info("Enabling custom Jackson JSON provider");
        set.add(new JacksonJsonProvider() /* optionally add .configure(SerializationFeature.INDENT_OUTPUT, true) */);
        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<>();
        // ... add your own REST enabled classes here ...
        return resources;
    }
}

我的pom.xml包含:

My pom.xml contains:

    <dependency>
        <!-- REST (Jackson as JSON mapper) -->
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>2.2.3</version>
    </dependency>
    <dependency>
        <!-- REST (Jackson LowerCaseWithUnderscoresStrategy etc.) -->
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.2.3</version>
    </dependency>

希望这对某人有帮助!

这篇关于Java EE7 REST服务器不再返回List&lt; String&gt;作为JSON的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆