我正在编写一个EJB作为契约第一个SOAP服务,我从WSDL生成java类和SEI。 WSDL指定了几种带约束的类型(最大长度,模式等)。生成的java类是JAXB注释但缺少约束元数据,因为JAXB注释不支持这些。这意味着只有在通过SOAP端点调用服务时才会发生输入验证。
问题是当另一个EJB调用EJB时,由于它位于XML堆栈中,因此绕过了验证。我想禁用XML Schemavalidation并使用Bean Validation,因此验证适用于调用EJB的两种方式(SOAP和RMI)。
问题:如何在Java类上生成JAXB注释以及Bean Validation注释?
答案 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)
答案 3 :(得分:2)