gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:46:07 26 4
gpt4 key购买 nike

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

虽然我已经看到一些关于 JSR-303 的 JPA/Hibernate 应用程序的讨论,但我正在努力寻找是否有任何可应用于 Web 服务/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 验证异常,除了我不知道会发生什么,因为 Bean 验证不会触发。

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

  1. 抛出异常
  2. 忽略映射,因为该属性无效(我真的希望 JSR-303 实现不会这样做 - 除非我明确要求,否则这将是意外行为)

因此,总而言之,我认为我可以选择以下问题:

A.我如何指示 EclipseLink MOXy 应用 Bean 验证,或者如果它在类路径中找不到 JSR-303 实现,它至少应该警告我吗?

B.或者,是否有其他(更好的?)方法来实现我的要求?

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

版本(如果相关):

  • Java 7
  • EclipseLink 2.5.2

最佳答案

唯一可用的解决方案是使用 MOXy 2.6+ 版作为 JAXB 提供程序。然后将在默认配置中自动为您完成您想要的操作(可以关闭此 BV 支持)。 MOXy 当前绑定(bind)到 EclipseLink 项目,因此您必须使用 EclipseLink(它还实现了 JPA、SDO、JSON)。

目前,EclipseLink 的 2.6.0-M3 版本可从以下网址获得: sonatypemaven .

预计在 2015 年第一季度发布。

关于java - 在将 XML 解码为对象时,EclipseLink MOXy 是否能够应用 JSR-303 Bean 验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27107820/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com