java - 在没有 Spring 的情况下解决 JAX RS 中的数组序列化
问题描述
我需要为数据库创建一个简单的 REST 接口以进行数据迁移。我所做的是使用 Netbeans 从数据库中生成实体类和 bean,并编写一些简单的 REST 服务。然后我遇到了 Jettison 的序列化问题,其中只有一个元素的列表不会序列化为列表。
我找到了这个问题的解决方案,似乎都需要 Spring 重新定义序列化提供程序或重新配置 Jettison 的“serializeAsArray”和“arrayKeys”。
有没有办法在不需要 Spring 框架的情况下使用 Jackson 或配置 Jettison?
这是 REST 服务定义:
@Path("/reseller")
@Produces({"application/json;charset=utf-8"})
public class ResellerWS {
@EJB
private ResellerFacade reseller;
@Path("/{id}")
@GET
public Reseller get(@PathParam("id") long id)
{
ResellerReseller result = reseller.find(id);
return result;
}
这是重要实体的一部分。resellerdepartmentList 不序列化为具有一个条目的列表,而仅作为条目本身:
@OneToMany(mappedBy = "resellerId", fetch = FetchType.EAGER)
private List<Resellerdepartment> resellerdepartmentList;
...
public List<Resellerdepartment> getResellerdepartmentList() {
return resellerdepartmentList;
}
该服务在 TomEE Plus 1.7.4 下运行
解决方案
有没有办法在不需要 Spring 框架的情况下使用 Jackson 或配置 Jettison?
我强烈建议你使用 Jackson 而不是 Jettison,它不需要配置 Spring。
要将 Jackson 用作 JAX-RS 的 JSON 提供程序,jackson-jaxrs-json-provider
请在项目依赖项中添加工件:
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.9.5</version>
</dependency>
该模块包含JacksonJsonProvider
该类,它是 JAX-RS 抽象(MessageBodyReader
和MessageBodyWriter
)的基本实现,用于将 JSON 内容绑定到 Java 对象和从 Java 对象绑定。
要ObjectMapper
在 JAX-RS 中进行配置,您可以创建一个ContextResolver
实现。它将被JacksonJsonProvider
:
@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
private final ObjectMapper mapper;
public ObjectMapperContextResolver() {
this.mapper = createObjectMapper();
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
private ObjectMapper createObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
// Configure as per your needs
return mapper;
}
}
@Provider
注释标记了 JAX-RS 运行时应该可以发现的扩展接口的实现。或者,您可以在扩展类中注册提供程序Application
。
推荐阅读
- python-3.x - For-Loop stops working after 2 iterations
- ssl-certificate - 如何通过 Java 代码和 TestNg 测试类处理 API 自动化测试中的 SSL?
- python - dask df 列的字符串增量
- php - 如何更快地从 json 文件加载到我的数据表中?
- django - 对于实时 Web 应用程序、ajax 或 websocket,什么更有效?
- ios - 如何从另一个 iOS 应用程序检索 iOS 应用程序信息?
- reactjs - 如何为维护选择状态的列表设计 Redux Store
- python - 如何对具有多个时间范围的熊猫数据框进行切片?
- clang - 如何在基于libtooling的工具中获取编译命令
- python - 从终端运行单元测试时导入错误