2011-11-04 130 views
12

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

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

问题:如何生成不仅JAXB注释,而且还生成Java类上的Bean验证注释?

回答

4

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

+0

这当然是一个interresting指针。谢谢。 –

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); 
    } 

} 

完整的例子

+0

如果我想向用户显示很好的验证信息? Bean Validation会返回有帮助的'ConstraintViolation'对象,但是XML Validator似乎满足于仅仅返回一个简单的字符串,并且对错误进行了非常技术性的描述? – meriton

2

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

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