【问题标题】:Handling Invalid Enums with JAX-RS and MOXy使用 JAX-RS 和 MOXy 处理无效枚举
【发布时间】:2014-04-01 19:09:00
【问题描述】:

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

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

除了在负载中提供了无效的 ENUM 值之外,一切都按预期工作

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 忽略转换错误的结果,请参阅 Handling invalid enum values while doing JAXB Unmarshalling

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

当使用 JAX-RS 和 MOXy 作为默认提供程序时,我不知道该怎么做是覆盖忽略转换错误的默认行为。

【问题讨论】:

    标签: java json jaxb moxy glassfish-4


    【解决方案1】:

    最简单的做法是创建一个XmlAdapter 并自己处理Stringenum 的转换。那么当值不正确时,你可以采取相应的行动。

    【讨论】:

    • 我已经厌倦了。问题是适配器中抛出的任何异常都会被 JAXB 吞下,就像上面的转换错误一样。
    【解决方案2】:

    我已经通过将 RatingInfo 中的 Rating Enum 变量更改为字符串来解决这个问题:

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

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

    这并不理想,因为我希望在我的 RatingInfo bean 中使用 Enum,但它现在确实解决了问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-10
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      相关资源
      最近更新 更多