2015-10-26 67 views
1

有沒有辦法讓java bean驗證1.1爲JAX-WS工作?我只看過適用於JAX-RS的文章。我想要做的是能夠將驗證約束註釋添加到特定的操作中,並將一個驗證約束註釋添加到整個SOAP消息或SOAP Body中,以執行使用規範化和Schematron(可能不是Schema驗證)的自定義驗證。Bean Validation和JAX-WS

回答

0

JAX-WS中的輸入驗證通常是在bean實例化之前在SOAP/XSD Schema/JAXB級別上完成的,這就是爲什麼您找不到顯示如何將這兩件事情一起使用的文章。

此外,bean驗證不能用於使用XML/XPath操作的schematron樣式驗證。

另一方面,Java bean驗證是一個規範。它是Java EE中運行的Java EE的一部分。它可以用於各種框架和庫,包括JAX-WS實現。如果bean驗證沒有被使用的框架原生支持,驗證過程可以手動觸發。

所以,一般來說,可以在JAX-WS中使用bean驗證。也可以實現各種自定義註釋以支持規範化。同時,儘管執行和處理有相似之處,但我不會將標準化和驗證過程混合在一起。

下面的代碼顯示了幾個簡單的例子,說明如何使用bean驗證,儘管有上下文/應用程序框架。

1.值對象必須被標註

public class Address { 

    @Size(max = 100) 
    private String City; 

    @NotNull 
    @Size(max = 200) 
    private String Street; 

    @Email 
    private String email; 

    @CountryCode 
    private String countryCode; 
} 

2.驗證過程可以手動觸發:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 

Validator validator = factory.getValidator(); 

Set<ConstraintViolation<Address>> constraintViolations = validator.validate(address); 

3.自定義註釋可以被實現爲支持特定用途案例。

下面是一個用於驗證國家代碼的註釋示例。請注意,執行驗證的類包含在註釋代碼中,這在某些情況下是合理的,以避免很多很短的類。

@Documented 
@Constraint(
     validatedBy = {CountryCode.CountryCodeValidator.class} 
) 
@Target({ElementType.METHOD, 
     ElementType.FIELD, 
     ElementType.ANNOTATION_TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface CountryCode { 

    String message() default "Unknown Country code"; 

    Class<?>[] groups() default {}; 

    Class<? extends ValidationErrorType>[] payload() default {}; 

    /** 
    * Validator implementation 
    */ 
    class CountryCodeValidator implements ConstraintValidator<CountryCode, String> { 

     private static final Set<String> ISO_COUNTRIES = 
       new HashSet<String>(Arrays.asList(Locale.getISOCountries())); 

     private CountryCode countryCodeAnnotation; 

     @Override 
     public void initialize(CountryCode countryCodeAnnotation) { 
      this.countryCodeAnnotation = countryCodeAnnotation; 
     } 

     @Override 
     public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { 
      if (s==null) { 
       return true; 
      } 

      return ISO_COUNTRIES.contains(s); 
     } 
    } 
} 
+0

我實際上試圖驗證一個WebParam,而不是一個字段。我應該能夠將它添加到WebParam的前面?有沒有辦法讓驗證自動運行?你如何建議從驗證中分離出標準化? – user994165