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

使用JAX-RS和MOXy处理无效的ENums

葛磊
2023-03-14

我目前正在尝试使用Glassfish 4(使用Jersery 2.0和EclipseLink 2.5)解构通过REST PUT提供的JSON对象。

JSON对象由多个属性组成,包括映射到Java枚举的字符串值。

除了有效负载中提供了无效的枚举值外,其他一切都正常工作

JSON对象:

{
  "rating":"INVALID",
  ...
}

被解组为:

public RatingInfo {
    @ValidRating
    private Rating rating;
    ...

    public Rating getRating(){...}
    public void setRating(Rating rating){...}
    ...
}

public enum Rating {
    G,
    PG
}

如果JSON负载中的值不是有效的Rating,它当前返回null,这似乎是JAXB忽略转换错误的结果(请参阅在执行JAXB解组时处理无效枚举值)

问题是我需要区分评级实际为null的情况(这是有效的用例)和JSON中评级值无效的情况,以便我可以在REST响应中返回400错误。

当使用JAX-RS和MOXy作为默认提供程序时,我不知道如何重写忽略转换错误的默认行为。

共有2个答案

萧浩漫
2023-03-14

目前,我已通过将RatingInfo中的Rating Enum变量更改为字符串来解决此问题:

public RatingInfo {
    @ValidRating
    private String rating;
    ....
}

在ValidRating bean验证器中,我然后根据枚举验证字符串值,以确保传入的字符串是有效的评级,如果失败,框架将抛出一个ConstraintViolationException,我将其映射到400。

这并不理想,因为我更喜欢在RatingInfo bean中使用枚举,但它现在确实解决了问题。

查淮晨
2023-03-14

最简单的方法是创建一个XmlAdapter并自己处理从Stringenum的转换。然后,当值不正确时,您可以相应地操作。

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

  • 我正在开发一个java脚本客户端应用程序,在服务器端我需要处理CORS,所有我用JAX-RS和Jersey编写的服务。我的代码: 感谢佛普尼

  • 问题内容: 我正在开发一个Java脚本客户端应用程序,在服务器端我需要处理CORS,以及我用JERSEY用JAX-RS编写的所有服务。我的代码: 到目前为止,我收到错误消息请求的资源上没有标头。因此,不允许访问源’ http:// localhost:8080 ‘。” 请协助我。 问题答案: 注意:请务必阅读底部的UPDATE 是CXF批注,因此不适用于Jersey。 对于Jersey,要处理CO

  • 问题内容: 我正在开发一个Java脚本客户端应用程序,在服务器端我需要处理CORS,以及我用JERSEY用JAX-RS编写的所有服务。我的代码: 到目前为止,我收到错误消息在请求的资源上没有标头。因此,不允许访问源’ http:// localhost:8080 ‘。” 问题答案: 注意:请务必阅读底部的UPDATE @CrossOriginResourceSharing 是CXF批注,因此不适用

  • 我正在尝试创建一个简单的REST api,我遵循了Jersey网站上的教程:https://jersey.java.net/nonav/documentation/2.0/deployment.html 以下是错误: 原因:javax.servlet.unavailableException:org.eclipse.jetty.servlet.baseholder.doStart(basehold

  • webresources定义如下。这个类是由NetBeans自动添加的。