编程语言
首页 > 编程语言> > java-在将XML解组到对象时,EclipseLink MOXy是否能够应用JSR-303 Bean验证?

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=431803https://wiki.eclipse.org/EclipseLink/Development/2.6.0

标签:jaxb,eclipselink,bean-validation,moxy,java
来源: https://codeday.me/bug/20191121/2048520.html