在 Glassfish/Payara 上使用 JAX-RS 进行自定义 JSON 编组

问题描述 投票:0回答:1

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

我想为我的

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

我尝试使用

@JsonValue
并编写了一个实现
javax.ws.rs.ext.MessageBodyWriter
JsonSerializer<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...
        }
    }
}

还有 JAX-RS 类,我想在其中将

ErrorInfo
实例作为 JSON 发回:

@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个回答
0
投票

默认情况下,Payara Server 使用 MOXy 映射到 JSON 或从 JSON 映射。如果您将 Jackson 添加到您的应用程序并将

JacksonFeature
添加到 JAX-RS 类中,您可以使用像 Jackson 这样的替代方法:Force Glassfish4 使用 Jackson 而不是 Moxy

在即将支持 Java EE 8 的 Payara 5 中,JSON 编组将以 JSON-Binding

规定的标准方式处理
© www.soinside.com 2019 - 2024. All rights reserved.