【问题标题】:Resolve array serialization in JAX RS without Spring在没有 Spring 的情况下解决 JAX RS 中的数组序列化
【发布时间】:2023-03-20 11:57:02
【问题描述】:

我需要为数据库创建一个简单的 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 下运行

【问题讨论】:

    标签: java jakarta-ee jax-rs apache-tomee


    【解决方案1】:

    有没有办法在不需要 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 对象绑定。

    要在 JAX-RS 中配置 ObjectMapper,您可以创建一个 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 的类中注册提供程序。

    【讨论】:

    • 这完成了工作,非常感谢。我也不使用 Maven,所以我在项目中添加了 jackson-annotations、jackson-core、jackson-databind、jackson-jaxrs-json-provider 和 jackson-jaxrs-base。首先,我将它们添加到 TomEE 中不起作用的库中(Json 保持不变,仍然需要检查原因,也许我忘记了一个 jar 或其他东西),然后添加到项目本身。最后我不得不用@JsonIgnore 交换所有@XmlTransient 注释。瞧!
    猜你喜欢
    • 2022-10-16
    • 1970-01-01
    • 2019-09-17
    • 2015-06-26
    • 1970-01-01
    • 2014-09-23
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多