【问题标题】:How can I generate Java objects with Bean Validation annotations from an XSD?如何从 XSD 生成带有 Bean Validation 注释的 Java 对象?
【发布时间】:2011-12-22 02:40:30
【问题描述】:

我正在编写一个 EJB 作为合同优先 SOAP 服务,并从 WSDL 生成 java 类和 SEI。 WSDL 指定了几种带有约束的类型(最大长度、模式等)。生成的 java 类是 JAXB 注释的,但缺少约束元数据,因为 JAXB 注释不支持这些。这意味着只有在通过 SOAP 端点调用服务时才会进行输入验证。

问题是,当另一个 EJB 调用 EJB 时,验证被绕过,因为它位于 XML 堆栈中。我想禁用 XML Schemavalidation 并改用 Bean Validation,以便验证适用于调用 EJB 的两种方式(SOAP 和 RMI)。

问题:如何在 Java 类上不仅生成 JAXB 注释,还生成 Bean Validation 注释?

【问题讨论】:

    标签: java xml validation annotations jaxb


    【解决方案1】:

    您可以使用 MOXy 版本 2.6+ 作为 JAXB 提供程序,这将自动完成。 MOXy 是 EclipseLink 项目中的一个框架模块。

    目前,EclipseLink 的 2.6.0-M3 版本可在以下位置获得: sonatypemaven

    【讨论】:

      【解决方案2】:

      你可以使用这个插件https://github.com/krasa/krasa-jaxb-tools从xsd生成Bean Validation注解

      【讨论】:

        【解决方案3】:

        您可以使用javax.xml.valdation API 针对 XML 模式验证使用 JAXB 映射的域模型。这种方法的一个优点是您对两个用例使用相同的验证规则(在 XML 模式中定义):

        import java.io.File;
        import javax.xml.XMLConstants;
        import javax.xml.bind.JAXBContext;
        import javax.xml.bind.util.JAXBSource;
        import javax.xml.validation.*;
        
        public class Demo {
        
            public static void main(String[] args) throws Exception {
                Customer customer = new Customer();
                customer.setName("Jane Doe");
                customer.getPhoneNumbers().add(new PhoneNumber());
                customer.getPhoneNumbers().add(new PhoneNumber());
                customer.getPhoneNumbers().add(new PhoneNumber());
        
                JAXBContext jc = JAXBContext.newInstance(Customer.class);
                JAXBSource source = new JAXBSource(jc, customer);
        
                SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
                Schema schema = sf.newSchema(new File("customer.xsd"));
        
                Validator validator = schema.newValidator();
                validator.setErrorHandler(new MyErrorHandler());
                validator.validate(source);
            }
        
        }
        

        完整示例

        【讨论】:

        • 如果我想向用户显示漂亮的验证消息? Bean Validation 将返回有用的 ConstraintViolation 对象,但 XML Validator 似乎满足于返回一个字符串,其中可能对错误进行了非常技术性的描述?
        【解决方案4】:

        到目前为止,我知道的最佳答案是使用 Annotate Plugin 添加 JSR 303 注释。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多