2011-11-04 38 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