@Valid Bean验证不适用于球衣

时间:2017-08-29 06:06:23

标签: java jersey-2.0

在我的pom.xml文件中,我添加了这些延迟的依赖项

 <dependency>
     <groupId>org.glassfish.jersey.ext</groupId>
     <artifactId>jersey-bean-validation</artifactId>
     <version>2.25.1</version>
  </dependency> 

并且在我的CustomApplication类中扩展了ResourceConfig我注册了这2个以下的属性

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;
.............
.............
}

在我的资源类中,我正在尝试使用g @Valid

来验证这一点
@Path("addplot")
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response addPlot(@Valid PlotDTO plot) 
{
 ..............
 ..............
}

当我发送请求时,这些@NotNull验证都没有工作

有人可以帮助我吗

2 个答案:

答案 0 :(得分:2)

@NotNull  

注释仅对字符串和包装器有效。它不适用于int,float和boolean等原语,因为它们已经有默认值。

答案 1 :(得分:-2)

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

  1. 为Spring实现ValidatorInitializingBean的类
  2. 为Jersey配置实现ContextResolver<ValidationConfig>的类。
  3. 实施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放入资源路径来实现内化和本地化。请参阅以下链接Github- bean-validation-webapp

相关问题