java-在将XML解组到对象时,EclipseLink MOXy是否能够应用JSR-303 Bean验证?
作者:互联网
如果我正确理解JSR-303的精神,它旨在允许在应用程序体系结构的多个层上应用Bean(数据)验证.
尽管我看到了一些有关JSR-303的JPA / Hibernate应用程序的讨论,但我正在努力寻找是否有任何可行的实现可应用于Web服务/ JAXB编组(即更靠近表示层).
这是我因Bean验证而失败的一个相当人为的示例:
方类
@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验证异常,但我不知道会发生什么,因为Bean验证不会触发.
我的困惑是,我认为我什至不应该在上述测试中得出断言,并且成功地对3值进行反序列化,而没有一个:
>引发异常
>因为属性无效而忽略了映射(我真的希望JSR-303实现不会这样做-除非我明确要求,否则这将是意外行为)
因此,总而言之,我认为这让我选择了一个问题,或者:
答:如何指示EclipseLink MOXy应用Bean验证,或者如果它无法在类路径中找到JSR-303实现,它应该至少警告我?
B.或者,还有另一种(更好的)方法来实现我所要求的吗?
(假设我知道我可以根据需要手动验证和/或实现@XmlJavaTypeAdapter,它们并不是我首选的优雅解决方案)
版本(如果相关):
> Java 7
> EclipseLink 2.5.2
解决方法:
我认为您要的是Eclipse Link 2.6.0.另请参见https://bugs.eclipse.org/bugs/show_bug.cgi?id=431803和https://wiki.eclipse.org/EclipseLink/Development/2.6.0
标签:jaxb,eclipselink,bean-validation,moxy,java 来源: https://codeday.me/bug/20191121/2048520.html