下面是我的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) 我有一些模特课
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控制器的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) 在我的一个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) 我正在验证我的数据访问对象类的字段。在一次尝试中,我开始向属性(@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)
当我使用BindingResult同@Validated一个方法的注释,验证无法正常工作。如果我BindingResult从方法参数中删除,它工作正常。我用过@ControllerAdvice。
知道为什么它不起作用吗?
我的代码如下:
public ResponseEntity<?> dologin(
@Validated({ Group.Login.class }) @RequestBody User user,
BindingResult errors)
{
// somecode
}
Run Code Online (Sandbox Code Playgroud)
根据验证、数据绑定和类型转换文档,任何验证消息都将自动添加到绑定器的BindingResult.
去掉不会有影响吧?
我正在使用 spring 来验证表单。表单的模型类似于:
public class FormModel {
@NotBlank
private String name;
@NotNull
@ImageSizeConstraint
private MultipartFile image;
}
Run Code Online (Sandbox Code Playgroud)
'@ImageSizeConstraint' 是一个自定义约束。我想要的是首先评估@NotNull,如果评估结果为false,则不评估@ImageSizeConstraint。
如果这是不可能的,我还必须检查自定义约束中的 null。这不是问题,但我想分开关注(不是空/图像大小/图像/纵横比/等)。
我正在使用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()方法上进行验证?建议解决问题?
我有一个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="")
我过去常常在我的春天里验证我的豆子@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
spring-validator ×10
java ×7
spring ×7
spring-mvc ×5
hibernate ×1
json ×1
kotlin ×1
rest ×1
spring-boot ×1
validation ×1