@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 验证正在工作

谁能帮我解决这个问题

请执行以下操作以进行验证。它对我有用。

  1. Class 为 Spring
  2. 实施 ValidatorInitializingBean
  3. Class 为 Jersey 配置实施 ContextResolver<ValidationConfig>
  4. 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 等基元,因为它们已经具有默认值。