如何使用XSD中的Bean Validation注释生成Java对象?

时间:2011-11-04 14:57:40

标签: java xml validation annotations jaxb

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

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

问题:如何在Java类上生成JAXB注释以及Bean Validation注释?

4 个答案:

答案 0 :(得分:6)

您可以使用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);
    }

}

完整示例

答案 1 :(得分:4)

我知道的最佳答案是使用Annotate Plugin添加JSR 303注释。

答案 2 :(得分:2)

您可以使用此插件https://github.com/krasa/krasa-jaxb-tools

从xsd生成Bean Validation注释

答案 3 :(得分:2)

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

目前,EclipseLink的2.6.0-M3版本可用于: sonatypemaven