标签: spring-validator

如果它不是Spring MVC中的bean,如何验证请求参数?

下面是我的spring MVC REST服务中的POST端点.我想使用spring验证框架工作来确保我收到的列表不为空.我该怎么做?我必须在周围提供包装豆listOfLongs吗?

    @RequestMapping(value = "/some/path", method = RequestMethod.POST)
    @ResponseBody
    public Foo bar(@Valid @NotEmpty @RequestBody List<Long> listOfLongs) {

     /*   if (listOfLongs.size() == 0) {
            throw new InvalidRequestException();
        }
     */

        // do some useful work
    }
Run Code Online (Sandbox Code Playgroud)

请求机构应该是什么?

1) [123,456,789]
2) { listOfLongs : [123,456,789]}
Run Code Online (Sandbox Code Playgroud)

java rest json spring-mvc spring-validator

5
推荐指数
1
解决办法
4649
查看次数

如何在服务层中组合JSR-303和Spring Validator类?

我有一些模特课

public class Account {

    @Email
    private String email;

    @NotNull
    private String rule;
}
Run Code Online (Sandbox Code Playgroud)

和弹簧验证器

public class AccountValidator implements Validator {

    @Override
    public boolean supports(Class aClass) {
        return Account.class.equals(aClass);
    }

    @Override
    public void validate(Object obj, Errors errors) {
        Account account = (Account) obj;
        ValidationUtils.rejectIfEmpty(errors, "email", "email.required");
        ValidationUtils.rejectIfEmpty(errors, "rule", "rule.required");

        complexValidateRule(account.getRule(), errors);
    }

    private void complexValidateRule(String rule, Errors errors) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我在我的服务中运行

AccountValidator validator = new AccountValidator();
Errors errors = new BeanPropertyBindingResult(account, "account");
validator.validate(account, errors);
Run Code Online (Sandbox Code Playgroud)

我可以在验证过程中添加约束@Email,@ NotNull(JSR-303)并且不在AccountValidator中描述这些规则吗?

我知道Spring控制器中的@Valid是如何工作的,但服务层是什么?可能吗?如何以适当的方式进行此类验证?我可以使用Hibernate …

spring service-layer bean-validation spring-validator

5
推荐指数
1
解决办法
1572
查看次数

Spring 4 MVC验证无效-BindingResult hasErrors为false

我正在对Spring控制器的post方法(使用org.springframework.test.web.servlet.MockMvc)进行单元测试,并且试图确认表单中存在验证错误时,它将通过检查BindingResult.hasErrors方法将视图发送回表单。

这是我的测试

  @Test
  public void testFilterChannelProgrammesWhenChannelListAndGenreListAreEmptyAndProgNameIsTooLong() throws Exception {
    String progName = TestUtil.createStringWithLength(301);

    mockMvc.perform(post("/api/filter")
        .contentType(MediaType.APPLICATION_FORM_URLENCODED)
        .param("progName", progName)
        .sessionAttr("filter", new ProgrammeSearchDTO())
        )
        .andExpect(status().isOk())
        .andExpect(view().name("api/filter"))
        .andExpect(forwardedUrl("/WEB-INF/jsp/api/filter.jsp"))
        .andExpect(model().attributeHasFieldErrors("filter", "progName"))
        .andExpect(model().attributeHasFieldErrors("filter", "genreIdList"))
        .andExpect(model().attributeHasFieldErrors("filter", "channelIdList"))        
        .andExpect(model().attribute("filter", hasProperty("progName", is(progName))));

    verifyZeroInteractions(channelProgrammeServiceMock);
  }
Run Code Online (Sandbox Code Playgroud)

这是会话属性绑定到的DTO

import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;

public class ProgrammeSearchDTO {

  @NotEmpty
  private String[] channelIdList;

  @NotEmpty
  private String[] genreIdList;

  private String fromDateTime;
  private String toDateTime;

  @Length(max = 200)
  private String progName;

  private boolean subtitled;
  private boolean signed;
  private boolean film;

  public String[] getChannelIdList() …
Run Code Online (Sandbox Code Playgroud)

java spring spring-mvc spring-validator

5
推荐指数
1
解决办法
1万
查看次数

如何在拥有多个(自定义)验证器时使用MethodValidationPostProcessor?

在我的一个Spring应用程序中,我计划MethodValidationPostProcessor用于验证服务方法参数.据我所知,为此,我必须MethodValidationPostProcessor在ApplicationContext中有一个对象,而后者必须validator注入一个对象.我在@Configuration课堂上这样做:

@Bean
public LocalValidatorFactoryBean validator() {
    return new LocalValidatorFactoryBean();
}

@Bean
public MethodValidationPostProcessor getMethodValidationPostProcessor(){
    MethodValidationPostProcessor processor = new MethodValidationPostProcessor();
    processor.setValidator(validator());
    return processor;
}
Run Code Online (Sandbox Code Playgroud)

然后,我的服务类看起来像这样:

@Service
@Validated
public class SomeService {

    public void someMethod(@Valid SomeForm someForm) {
        .
        .
        .
    }

}
Run Code Online (Sandbox Code Playgroud)

但是,我的一些对象需要一些自定义验证器.例如,对于注册表单,我打算使用JoinDataValidator扩展LocalValidatorFactoryBean,如下所示:

@Service("joinDataValidator")
public class JoinDataValidator extends LocalValidatorFactoryBean {

    @Override
    public void validate(final Object target, final Errors errors) {
      super.validate(target, errors);
      // check for duplicate email
    }

    @Override …
Run Code Online (Sandbox Code Playgroud)

spring spring-mvc spring-validator

5
推荐指数
0
解决办法
2037
查看次数

何时使用 Bean 验证与自定义验证框架?

我正在验证我的数据访问对象类的字段。在一次尝试中,我开始向属性(@NotNull、@NotBlank、@Min、@Max 等)添加 Bean 验证注释。我还有更多注释 Jackson (JsonProperty (..)) 用于 swagger 库和文档(@Api (...))。在我看来,这个类非常“脏”,有很多注释(每个属性至少有三个注释)。一个字段的示例:

@JsonProperty("ownName")
@Api(description="it is my own name" required=true)
@Valid
@NotNull
private SomeObject object; 
Run Code Online (Sandbox Code Playgroud)

在另一次尝试中,我使用 SpringValidator接口执行了我自己的验证。如果使用自定义验证器,例如 Spring 接口,它似乎更清晰,并且还允许您自由地为不同情况生成多个验证器。此外,该类似乎没有过多的注释和验证独立于该类。示例Validator

public class UserValidator implements Validator {

    @Override
    public boolean supports(Class<?> arg0) {
        return User.class.isAssignableFrom(arg0);
    }

    @Override
    public void validate(Object obj, Errors error) {
        User user = (User) obj;
        if(user.getPassword().length() < 10)
        {
            error.reject("Password must be lesser than 10");
        }

        //more validations....

    }
}
Run Code Online (Sandbox Code Playgroud)
  • 你什么时候会使用一个或另一个?
  • 各自的优缺点是什么?

java validation spring bean-validation spring-validator

5
推荐指数
1
解决办法
1218
查看次数

带有 BindingResult 的 Spring 4 @Validation 注释不起作用

当我使用BindingResult@Validated一个方法的注释,验证无法正常工作。如果我BindingResult从方法参数中删除,它工作正常。我用过@ControllerAdvice

知道为什么它不起作用吗?

我的代码如下:

public ResponseEntity<?> dologin(
        @Validated({ Group.Login.class }) @RequestBody User user,
        BindingResult errors)
{
    // somecode
}
Run Code Online (Sandbox Code Playgroud)

根据验证、数据绑定和类型转换文档,任何验证消息都将自动添加到绑定器的BindingResult.

去掉不会有影响吧?

java spring spring-validator

5
推荐指数
1
解决办法
6546
查看次数

多重约束弹簧验证

我正在使用 spring 来验证表单。表单的模型类似于:

public class FormModel {

    @NotBlank
    private String name;

    @NotNull
    @ImageSizeConstraint
    private MultipartFile image;

}
Run Code Online (Sandbox Code Playgroud)

'@ImageSizeConstraint' 是一个自定义约束。我想要的是首先评估@NotNull,如果评估结果为false,则不评估@ImageSizeConstraint。

如果这是不可能的,我还必须检查自定义约束中的 null。这不是问题,但我想分开关注(不是空/图像大小/图像/纵横比/等)。

java spring-validator

5
推荐指数
1
解决办法
4958
查看次数

Spring JPA不会在更新时验证bean

我正在使用Spring Boot 1.5.7,Spring JPA,Hibernate验证,Spring Data REST,Spring HATEOAS.

我有一个像这样的简单bean:

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;

    @NotBlank
    private String name;
}
Run Code Online (Sandbox Code Playgroud)

如你所见,我正在使用@NotBlank.根据Hibernate文档,验证应该在pre-persist和pre-update上进行.

我创建了一个junit测试:

@Test(expected = ConstraintViolationException.class)
public void saveWithEmptyNameThrowsException() {  
    Person person = new Person();
    person.setName("");
    personRepository.save(person);
}
Run Code Online (Sandbox Code Playgroud)

此测试工作正常,因此验证过程正确.相反,在此测试用例中,验证不起作用:

@Test(expected = ConstraintViolationException.class)
public void saveWithEmptyNameThrowsException() {
   Person person = new Person();
   person.setName("Name");
   personRepository.save(person);

   person.setName("");
   personRepository.save(person);
}
Run Code Online (Sandbox Code Playgroud)

我发现了另一个类似的问题,但遗憾的是没有任何答复.为什么不在update()方法上进行验证?建议解决问题?

java spring hibernate spring-validator spring-boot

5
推荐指数
1
解决办法
628
查看次数

匹配无效电子邮件地址的javax.validation.constraints.Email

我有一个User实体,其电子邮件属性带有注释@Email

@Email
private String email;
Run Code Online (Sandbox Code Playgroud)

@Valid在我的Controller类上使用(javax.validation.Valid)批注。问题是控制器验证程序正在传递无效的电子邮件。示例:
pusp @ 1-显然这是一个无效的电子邮件地址
pusp @ fake
我注意到的模式是,@Email只需要sometext @ text,它不需要扩展名(.com / org等)。这是预期的行为吗?我是否需要通过自己的正则表达式实现@Email(regex="")

java spring-mvc spring-validator

5
推荐指数
1
解决办法
6771
查看次数

@Valid @CustomValidator在Spring @Service中

我过去常常在我的春天里验证我的豆子@RestController:

@PostMapping("/documents")
@ResponseStatus(HttpStatus.CREATED)
fun create(@Valid @RequestBody document: DocumentCreate) {
    return documentService.create(document)
}
Run Code Online (Sandbox Code Playgroud)

即使它看起来很愚蠢,我现在想根据DocumentCreate布尔属性验证我的bean,如:

@PostMapping("/documents")
@ResponseStatus(HttpStatus.CREATED)
fun create(@RequestBody document: DocumentCreate) {
    return when {
        document.needValidation -> documentService.createWithValidation(document),
        else -> documentService.createWithoutValidation(document)
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图将@Valid注释移动到文档@Service类,但它不会触发验证.我怎样才能做到这一点?可能吗?

spring spring-mvc hibernate-validator kotlin spring-validator

5
推荐指数
1
解决办法
851
查看次数