Bean 验证和 JAX-WS
Bean Validation and JAX-WS
有没有办法让 java bean validation 1.1 为 JAX-WS 工作?我只看过适用于 JAX-RS 的文章。我想要做的是能够为特定操作添加验证约束注释,并为整个 SOAP 消息或 SOAP 主体添加一个验证约束注释,以执行使用规范化和 Schematron(不是 XML 模式验证)的自定义验证。 )
JAX-WS 中的输入验证通常在 beans 实例化之前在 SOAP/XSD Schema/JAXB 级别上完成,这就是为什么您找不到说明如何一起使用这两者的文章的原因。
此外,bean 验证不能用于使用 XML/XPath 操作的 schematron 样式验证。
另一方面,Java bean validation 是一个规范。它是 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。可以实施自定义注释以支持特定用例。
下面是用于验证国家代码的注释示例。请注意,执行验证的 class 包含在注释代码中,这在某些情况下可以避免许多非常短的 classes。
@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);
}
}
}
有没有办法让 java bean validation 1.1 为 JAX-WS 工作?我只看过适用于 JAX-RS 的文章。我想要做的是能够为特定操作添加验证约束注释,并为整个 SOAP 消息或 SOAP 主体添加一个验证约束注释,以执行使用规范化和 Schematron(不是 XML 模式验证)的自定义验证。 )
JAX-WS 中的输入验证通常在 beans 实例化之前在 SOAP/XSD Schema/JAXB 级别上完成,这就是为什么您找不到说明如何一起使用这两者的文章的原因。
此外,bean 验证不能用于使用 XML/XPath 操作的 schematron 样式验证。
另一方面,Java bean validation 是一个规范。它是 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。可以实施自定义注释以支持特定用例。
下面是用于验证国家代码的注释示例。请注意,执行验证的 class 包含在注释代码中,这在某些情况下可以避免许多非常短的 classes。
@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);
}
}
}