json - Java EE7 REST 服务器不再将 List<String> 作为 JSON 返回

标签 json rest java-ee-7

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

@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。这些概念仍然正确吗?

最佳答案

我花了几个小时,但我终于自己解决了这个问题。
第一个事实是 Glassfish4 JAX-RS 实现“Jersey”将其底层 JSON 库从 Jackson 1.x 切换到 Eclipselink MOXy。后者似乎无法开箱即用地将列表、数组和任意 POJO 转换为 JSON。因此我试图强制 JAX-RS 使用 Jackson 2.x 并禁用 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 包含:
    <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>

希望这可以帮助某人!

关于json - Java EE7 REST 服务器不再将 List<String> 作为 JSON 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22781619/

相关文章:

java - Javascript JNI 覆盖类型中 Long 的 GWT 问题

r - 如何将一个大型、复杂、深度嵌套的 JSON 文件扁平化为多个 CSV 文件(链接标识符)

ios - 处理 REST 中的 Swift 选项和部分 JSON 表示/响应

web-services - Tomcat,JAX-RS( Jersey ),@PathParam : how to pass two variables containing slashes

java - 嵌入式 Jetty 和 Jax-rs xml 配置

jakarta-ee - CDI @Transactional REQUIRES_NEW 是否适用于本地方法

json - 即使存在值,Go map 也会返回 nil 值

android - 使用 oAuth 的 RESTful Web 服务用于移动应用程序

Java EE CDI 部署异常 - WELD-001408 : Unsatisfied dependencies for type EntityManager with qualifiers @Default

Java EE 7 Batch API - MultiResourceItemReader 对应项