【问题标题】:Bean Validation and JAX-WSBean 验证和 JAX-WS
【发布时间】:2016-01-26 02:43:08
【问题描述】:

有没有办法让 java bean 验证 1.1 为 JAX-WS 工作?我只看过适用于 JAX-RS 的文章。我想要做的是能够向特定操作添加验证约束注释,并为整个 SOAP 消息或 SOAP 主体添加一个验证约束注释,以进行使用规范化和可能使用 Schematron(不是 XML 模式验证)的自定义验证。

【问题讨论】:

    标签: java jakarta-ee soap jax-ws


    【解决方案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);
            }
        }
    }
    

    【讨论】:

    • 我实际上是在尝试验证 WebParam,而不是字段。我应该可以将它添加到 WebParam 的前面吗?有没有办法让验证自动运行?您如何建议将规范化与验证分开?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 2012-01-05
    • 2010-12-28
    • 1970-01-01
    相关资源
    最近更新 更多