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

Gee*_*ing 12 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注释?

bdo*_*han 6

您可以使用javax.xml.valdationAPI来验证针对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);
    }

}
Run Code Online (Sandbox Code Playgroud)

完整的例子


Meo*_*Meo 2

您可以使用此插件从 xsd 生成 Bean 验证注释https://github.com/krasa/krasa-jaxb-tools