如果我正确理解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 值在没有任何一个的情况下成功反序列化:
总而言之,我认为这让我可以选择一些问题:
:一种。如何指示EclipseLink MOXy应用Bean Validations,或者它是否至少警告我,如果它无法在类路径中找到JSR-303实现?
B中。或者,是否有另一种(更好的?)方式来实现我的要求?
(假设我知道我可以在必要时手动验证和/或实施@XmlJavaTypeAdapter
- 它们不是我首选的优雅的解决方案)
版本(如果相关):
答案 0 :(得分:2)
唯一可用的解决方案是使用MOXy 2.6+作为JAXB提供程序。在默认配置中,您将自动完成所需的操作(可以关闭此BV支持)。 MOXy目前与EclipseLink项目相关联,因此您必须使用EclipseLink(它还实现了JPA,SDO,JSON)。
目前,EclipseLink的2.6.0-M3版本可用于: sonatype 或maven。
预计将于2015年第一季度发布。
答案 1 :(得分:1)
我认为您要求的是Eclipse Link 2.6.0。另请参阅https://bugs.eclipse.org/bugs/show_bug.cgi?id=431803和https://wiki.eclipse.org/EclipseLink/Development/2.6.0