在将XML解组为对象时,EclipseLink MOXy是否能够应用JSR-303 Bean验证?

时间:2014-11-24 15:02:53

标签: java jaxb eclipselink bean-validation moxy

如果我正确理解JSR-303的精神,那么它的目的是允许在应用程序架构的多个层上应用Bean(数据)验证。

虽然我已经看到围绕JSR-303的JPA / Hibernate应用程序的一些讨论,但我很难找到是否有任何可以应用于Web Services / JAXB解组的工作实现(即更接近表示层)

这是一个相当人为的例子,我想因Bean审核而失败:

Square.class

@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
@XmlRootElement(name = "square")
public class Square {

   @Size(min = 4, max = 4)
   private int numberOfSides;

   public void setNumberOfSides(int numSides) {
       this.numberOfSides = numSides;
   }

   public int getNumberOfSides() {
      return this.numberOfSides;
   }
}

测试类

@RunWith(JUnit4.class)
public class BeanValidationTest {

   @Test
   public void Should_not_unmarshal_invalid_numberOfSides_value() throws JAXBException    {
     String xml = "<square>" +
                 "  <numberOfSides>3</numberOfSides>" +
                 "</square>";

     JAXBContext context = org.eclipse.persistence.jaxb.JAXBContext.newInstance(Square.class);

     Unmarshaller unmarshaller = context.createUnmarshaller();

     Square result = (Square) unmarshaller.unmarshal(new StringReader(xml));

     assertThat(result.getNumberOfSides(), equalTo(4));
   }
}

注意:由于预期的边数约束,测试将失败,因此失败:

java.lang.AssertionError: 
Expected: <4>
 but: was <3>

我会重写以期待Bean Validation异常,除了我不知道会发生什么,因为Bean Validation不会触发。

我的困惑是,我认为我甚至不应该在上面的测试中达到断言,并且 3 值在没有任何一个的情况下成功反序列化:

  1. 抛出异常
  2. 忽略映射,因为该属性无效(我真的希望JSR-303实现不会这样做 - 除非我明确要求,否则这将是意外行为)
  3. 总而言之,我认为这让我可以选择一些问题:

    :一种。如何指示EclipseLink MOXy应用Bean Validations,或者它是否至少警告我,如果它无法在类路径中找到JSR-303实现?

    B中。或者,是否有另一种(更好的?)方式来实现我的要求?

    (假设我知道我可以在必要时手动验证和/或实施@XmlJavaTypeAdapter - 它们不是我首选的优雅的解决方案)

    版本(如果相关):

    • Java 7
    • EclipseLink 2.5.2

2 个答案:

答案 0 :(得分:2)

唯一可用的解决方案是使用MOXy 2.6+作为JAXB提供程序。在默认配置中,您将自动完成所需的操作(可以关闭此BV支持)。 MOXy目前与EclipseLink项目相关联,因此您必须使用EclipseLink(它还实现了JPA,SDO,JSON)。

目前,EclipseLink的2.6.0-M3版本可用于: sonatypemaven

预计将于2015年第一季度发布。

答案 1 :(得分:1)