首页 > 解决方案 > 在没有 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 下运行

标签: javajakarta-eejax-rsapache-tomee

解决方案


有没有办法在不需要 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 抽象(MessageBodyReaderMessageBodyWriter)的基本实现,用于将 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


推荐阅读