Bean验证和JAX-WS

时间:2015-10-26 20:43:49

标签: java java-ee soap jax-ws

有没有办法让java bean验证1.1适用于JAX-WS?我只看过适用于JAX-RS的文章。我尝试做的是能够将验证约束注释添加到特定操作,并将一个添加到整个SOAP消息或SOAP Body中,以进行使用规范化的自定义验证,也可以使用Schematron(而不是XML模式验证)。 / p>

1 个答案:

答案 0 :(得分:1)

JAX-WS中的输入验证通常在bean实例化之前在SOAP / XSD Schema / JAXB级别上完成,这就是为什么你找不到展示如何一起使用这两件事的文章的原因。

此外,bean验证不能用于使用XML / XPath操作的schematron样式验证。

另一方面,Java bean验证是一种规范。它是Java EE的一部分,可以在Java SE中运行。它可以与各种框架和库一起使用,包括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);
        }
    }
}