lat*_*ell 5 rest json java-ee-7
以下示例适用于我的Java EE6(Glassfish3)项目,但在切换到Java EE7(Glassfish4)后失败.HTTP请求返回"500内部错误",Glassfish服务器日志中没有任何消息.该项目使用NetBeans8作为Maven Web Project进行设置,没有特殊的依赖项,beans.xml或其他配置.
@RequestScoped
@Path("generic")
public class GenericResource {
@GET
@Path("ping")
@Produces(APPLICATION_JSON)
public List<String> debugPing() {
return Arrays.asList("pong");
}
Run Code Online (Sandbox Code Playgroud)
然后:
$ curl -v http://localhost:8080/mavenproject2/webresources/generic/ping
> GET /mavenproject2/webresources/generic/ping HTTP/1.1
...
< HTTP/1.1 500 Internal Server Error
Run Code Online (Sandbox Code Playgroud)
据我了解,所有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;
}
}
Run Code Online (Sandbox Code Playgroud)
我的 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>
Run Code Online (Sandbox Code Playgroud)
希望这对某人有帮助!
| 归档时间: |
|
| 查看次数: |
1115 次 |
| 最近记录: |