@Valid Bean 验证在球衣中不起作用
@Valid Bean validation not working in jersey
在我的 pom.xml 文件中,我添加了这些休闲依赖项
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-bean-validation</artifactId>
<version>2.25.1</version>
</dependency>
并且在扩展 ResourceConfig
的我的 CustomApplication class 中,我已经注册了这两个休闲属性
property(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true);
property(ServerProperties.BV_DISABLE_VALIDATE_ON_EXECUTABLE_OVERRIDE_CHECK, true);
我有一个这样的 DTO (POJO)
import java.util.ArrayList;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.NotBlank;
public class PlotDTO {
private String guid;
@NotNull
private String plot_name;
@NotNull
private String farmer_id;
@NotNull
private float distance_from_warehouse;
@NotNull
private int area;
@NotNull
private float sand;
.............
.............
}
在我的资源 class 中,我正在尝试使用 @Valid
来验证这一点
@Path("addplot")
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response addPlot(@Valid PlotDTO plot)
{
..............
..............
}
当我发送请求时 none 这些 @NotNull 验证正在工作
谁能帮我解决这个问题
请执行以下操作以进行验证。它对我有用。
- Class 为 Spring
实施 Validator
、InitializingBean
- Class 为 Jersey 配置实施
ContextResolver<ValidationConfig>
。
Class 实施 ExceptionMaper<ConstraintViolationException>
@Component
public class BeanValidator implements Validator,InitializingBean {
private Validator validator;
public void afterPropertiesSet() throws Exception {
ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
validator = validatorFactory.usingContext().getValidator();
}
public boolean supports(Class clazz) {
return true;
}
public void validate(Object target, Errors errors) {
Set<ConstraintViolation<Object>> constraintViolations = validator.validate(target);
for (ConstraintViolation<Object> constraintViolation : constraintViolations) {
String propertyPath = constraintViolation.getPropertyPath().toString();
String message = constraintViolation.getMessage();
errors.rejectValue(propertyPath, "", message);
}
}
@Override
public ExecutableValidator forExecutables() {
// TODO Auto-generated method stub
return null;
}
@Override
public BeanDescriptor getConstraintsForClass(Class<?> arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public <T> T unwrap(Class<T> arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public <T> Set<ConstraintViolation<T>> validate(T arg0, Class<?>... arg1) {
// TODO Auto-generated method stub
return null;
}
@Override
public <T> Set<ConstraintViolation<T>> validateProperty(T arg0, String arg1, Class<?>... arg2) {
// TODO Auto-generated method stub
return null;
}
@Override
public <T> Set<ConstraintViolation<T>> validateValue(Class<T> arg0, String arg1, Object arg2, Class<?>... arg3) {
// TODO Auto-generated method stub
return null;
}
}
2. Jersey configuration Classes.
@Provider
public class ValidationConfigurationContextResolver implements ContextResolver<ValidationConfig> {
@Context
private ResourceContext resourceContext;
/**Get a context*/
@Override
public ValidationConfig getContext(Class<?> type) {
final ValidationConfig config = new ValidationConfig();
config.constraintValidatorFactory(resourceContext.getResource(InjectingConstraintValidatorFactory.class));
config.parameterNameProvider(new CustomParameterNameProvider());
return config;
}
private class CustomParameterNameProvider implements ParameterNameProvider {
private final ParameterNameProvider nameProvider;
public CustomParameterNameProvider() {
nameProvider = Validation.byDefaultProvider().configure().getDefaultParameterNameProvider();
}
@Override
public List<String> getParameterNames(final Constructor<?> constructor) {
return nameProvider.getParameterNames(constructor);
}
@Override
public List<String> getParameterNames(final Method method) {
return nameProvider.getParameterNames(method);
}
}
}
如果您使用 Maven,您可以通过使用 ValidationMessages.properties 放入资源路径来实现内部化和本地化。请参考下面link Github- bean-validation-webapp
@NotNull
注释仅对 Strings 和 Wrappers 有效。它不适用于 int、float 和 boolean 等基元,因为它们已经具有默认值。
在我的 pom.xml 文件中,我添加了这些休闲依赖项
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-bean-validation</artifactId>
<version>2.25.1</version>
</dependency>
并且在扩展 ResourceConfig
的我的 CustomApplication class 中,我已经注册了这两个休闲属性
property(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true);
property(ServerProperties.BV_DISABLE_VALIDATE_ON_EXECUTABLE_OVERRIDE_CHECK, true);
我有一个这样的 DTO (POJO)
import java.util.ArrayList;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.NotBlank;
public class PlotDTO {
private String guid;
@NotNull
private String plot_name;
@NotNull
private String farmer_id;
@NotNull
private float distance_from_warehouse;
@NotNull
private int area;
@NotNull
private float sand;
.............
.............
}
在我的资源 class 中,我正在尝试使用 @Valid
@Path("addplot")
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response addPlot(@Valid PlotDTO plot)
{
..............
..............
}
当我发送请求时 none 这些 @NotNull 验证正在工作
谁能帮我解决这个问题
请执行以下操作以进行验证。它对我有用。
- Class 为 Spring 实施
- Class 为 Jersey 配置实施
ContextResolver<ValidationConfig>
。 Class 实施
ExceptionMaper<ConstraintViolationException>
@Component public class BeanValidator implements Validator,InitializingBean { private Validator validator; public void afterPropertiesSet() throws Exception { ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); validator = validatorFactory.usingContext().getValidator(); } public boolean supports(Class clazz) { return true; } public void validate(Object target, Errors errors) { Set<ConstraintViolation<Object>> constraintViolations = validator.validate(target); for (ConstraintViolation<Object> constraintViolation : constraintViolations) { String propertyPath = constraintViolation.getPropertyPath().toString(); String message = constraintViolation.getMessage(); errors.rejectValue(propertyPath, "", message); } } @Override public ExecutableValidator forExecutables() { // TODO Auto-generated method stub return null; } @Override public BeanDescriptor getConstraintsForClass(Class<?> arg0) { // TODO Auto-generated method stub return null; } @Override public <T> T unwrap(Class<T> arg0) { // TODO Auto-generated method stub return null; } @Override public <T> Set<ConstraintViolation<T>> validate(T arg0, Class<?>... arg1) { // TODO Auto-generated method stub return null; } @Override public <T> Set<ConstraintViolation<T>> validateProperty(T arg0, String arg1, Class<?>... arg2) { // TODO Auto-generated method stub return null; } @Override public <T> Set<ConstraintViolation<T>> validateValue(Class<T> arg0, String arg1, Object arg2, Class<?>... arg3) { // TODO Auto-generated method stub return null; } } 2. Jersey configuration Classes. @Provider public class ValidationConfigurationContextResolver implements ContextResolver<ValidationConfig> { @Context private ResourceContext resourceContext; /**Get a context*/ @Override public ValidationConfig getContext(Class<?> type) { final ValidationConfig config = new ValidationConfig(); config.constraintValidatorFactory(resourceContext.getResource(InjectingConstraintValidatorFactory.class)); config.parameterNameProvider(new CustomParameterNameProvider()); return config; } private class CustomParameterNameProvider implements ParameterNameProvider { private final ParameterNameProvider nameProvider; public CustomParameterNameProvider() { nameProvider = Validation.byDefaultProvider().configure().getDefaultParameterNameProvider(); } @Override public List<String> getParameterNames(final Constructor<?> constructor) { return nameProvider.getParameterNames(constructor); } @Override public List<String> getParameterNames(final Method method) { return nameProvider.getParameterNames(method); } } }
如果您使用 Maven,您可以通过使用 ValidationMessages.properties 放入资源路径来实现内部化和本地化。请参考下面link Github- bean-validation-webapp
Validator
、InitializingBean
@NotNull
注释仅对 Strings 和 Wrappers 有效。它不适用于 int、float 和 boolean 等基元,因为它们已经具有默认值。