【问题标题】:Custom Json marshalling with JAX-RS on Glassfish/Payara在 Glassfish/Payara 上使用 JAX-RS 进行自定义 Json 编组
【发布时间】:2017-10-03 21:51:16
【问题描述】:

我很想知道 Glassfish/Payara 使用哪个 json 编组/解组框架是 JAX-RS 的情况,以及如何将自定义 json 映射器类添加到其中。

我想为我的Enum 类编写一个自定义序列化程序。我在 pom.xml 中为 jaxrs javaee-api 7.0 使用 provided 范围,因此使用默认的 Glassfish 库。

我尝试使用@JsonValue 并编写了一个实现javax.ws.rs.ext.MessageBodyWriterJsonSerializer<T> 的类。也不要像我期望的那样工作。

这是我的枚举类:

public enum ErrorCode {
    MY_ERROR(123456);

    private int value;

    ErrorCode(final int value) {
        this.value = value;
    }

    @JsonValue
    public int  getValue() {
        return value;
    }
}

使用枚举的类:

public class ErrorInfo {
    private ErrorCode errorCode;

    public String toJson() {
        try {
            return new ObjectMapper().writer().withDefaultPrettyPrinter().writeValueAsString(this);
        } catch (JsonProcessingException e) {
            // TODO: do something here...
        }
    }
}

还有我想将 ErrorInfo 实例作为 json 发回的 JAX-RS 类:

@Provider
public class MyExceptionMapper implements ExceptionMapper<Throwable> {
    @Override
    public Response toResponse(Throwable throwable) {
        ...
        return Response
                .status(errorInfo.getHttpStatus())
                .type(ExtendedMediaType.APPLICATION_JSON_UTF8)
                .entity(errorInfo)
                .build();
    }
}

如果我使用上面的代码,那么errorCode 值是“MY_ERROR”字符串而不是 int 123456 值。

如果我使用额外的 errorInfo.toJson() 方法,那么 @JsonValue 注释会发挥作用,但我想避免编写额外的代码来处理枚举序列化问题。

在 Glassfish/Payara 的默认 JAX-RS json 库中配置/添加额外枚举映射器类的正确方法是什么?

【问题讨论】:

    标签: java json glassfish jax-rs payara


    【解决方案1】:

    默认情况下,Payara 服务器使用MOXy 映射到/从 JSON。如果您将 Jackson 添加到您的应用程序并将 JacksonFeature 添加到 JAX-RS 类中,您可以使用类似 Jackson 的替代方法:Force Glassfish4 to use Jackson instead of Moxy

    在即将支持 Java EE 8 的即将推出的 Payara 5 中,JSON 编组将以 JSON-Binding 规定的标准方式处理

    【讨论】:

    • 您知道如何启用 Jackson 吗?我向我的 pom 添加了 org.glassfish.jersey.media:jersey-media-json-jackson 依赖项,但我得到 org.jboss.weld.exceptions.UnsatisfiedResolutionException: WELD-001334: Unsatisfied dependencies for type ObjectProvider with qualifiers @Default
    • 我在上面的答案中链接了如何做的答案。这是链接:stackoverflow.com/questions/18317927/…
    • 我已经尝试过了,但它对我不起作用:groups.google.com/forum/…
    • @zappee 我遇到了同样的问题,但我很幸运,我有一个可以运行的旧项目。对我来说导致 UnsatisfiedResolutionException 的原因是 jersey-media-json-jackson 版本 2.26 我将它改回 2.10.4 并且我不再有这个异常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多