当前位置: 首页 > 知识库问答 >
问题:

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

阙项禹
2023-03-14

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

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

我尝试使用@JsonValue并编写了一个类来实现javax.ws.rs.ext.MessageBodyWriterJsonSerializer

这是我的枚举类:

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类,我想在其中以json的形式发回ErrorInfo实例:

@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();
    }
}

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

如果我使用额外的错误信息。toJson()方法,然后@JsonValue注释发挥了神奇的作用,但我希望避免编写额外的代码来处理枚举序列化问题。

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

共有1个答案

沈成天
2023-03-14

默认情况下,Payara服务器使用MOXy映射到JSON或从JSON映射。如果您将Jackson添加到应用程序并将JacksonFeature添加到JAX-RS类中,您可以使用类似Jackson的替代方法:强制Glassfish4使用Jackson而不是Moxy

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

 类似资料:
  • 问题内容: 我有一个使用Jersey构建的REST服务。 我希望能够根据发送到服务器的MIME设置我的自定义异常编写器的MIME。当接收到json和接收到xml 时返回。 现在我进行了硬编码,但这使XML客户端陷入了黑暗。 我可以利用什么上下文来获取当前请求? 谢谢! 根据答案更新 对于对完整解决方案感兴趣的其他人: 连同 其中ErrorResponseConverter是自定义JAXB POJO

  • 问题内容: 我正在尝试使用异步响应构建REST Web服务。 我已经在网上解决了这个错误,但是,没有一种解决方案对我有用。我不确定如何去做。 这是REST服务的代码,它具有AsyncResponse,并且取自,我将在下面提供该文件中指定的jar文件。问题是,在部署战争时,我遇到一个例外: 我的课如下: 我的Maven文件如下: 问题答案: 是 当应用程序试图调用一个抽象方法抛出 。 是中的抽象方法

  • 我使用Glassfish、EclipseLink和JAX-RS提供REST服务,该服务通过AngularJS/AJAX从网站调用。我返回一个类型为SalesOrder的JSON对象,该对象具有一个类型为List的名为lineItems的属性 我已经成功地调用了REST资源,并返回了一个表示父对象的JSON对象,但是,即使服务器端日志表明响应对象具有带有(2)对象的实体,客户端/浏览器端的JSON对

  • 这并没有改变结果,而不是失败(应该失败),帖子仍然得到响应。我知道这些注释仍然需要一个验证器来验证它们。我是(假的?)在Jboss提供这样一个验证器的印象中。

  • 现在,当我发送包含以下json数据的POST请求时: 它工作得很好,MOXY会自动将这个json映射到用户对象,很好 但我需要使用另一层嵌套来处理json,如下所示:

  • 问题内容: 我一直在尝试使用NetBeans Ide创建一个简单的Restful WebService。 我的Java EE版本是:Java EE 7 Web。 我创建了一个新的Java Web应用程序,设置此ContexPath: 。 现在,运行我的应用程序,浏览器在以下位置显示我的页面: 因此,一切正常。 然后,我尝试使用RESTful Web服务向导创建一个简单的Restful资源。 因此,