9

粉丝说SpringBoot集成validation校验参数有坑,我试了试

 3 years ago
source link: https://blog.csdn.net/wo541075754/article/details/111209424
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

公众号中分享了一篇文章,关于SpringBoot集成validation校验参数的,粉丝留言说有坑。

原留言如下:

有坑,你试试^A-\\d{12}-\\d{4}$,这条正则经过validate这个方法无论参数写的对不对都会报验证错误,而用main方法测试是正常的。。

话说,针对这种回复我是不太信了,直觉告诉我,肯定是这位粉丝用错了。但既然粉丝有疑问还是需要专门写一个demo来验证一下的。说写就写。

SpringBoot集成validation

集成过程非常简单,在原项目的pom文件中直接引入如下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

引入之后,便可以在项目中使用@Valid等来进行校验了。

这里写一个简单的示例基于@Valid来验证提交的参数是否合法。首先建一个实体类,LoginForm(使用了Lombok):

@Data
public class LoginForm {

    @NotBlank(message = "邮箱不能为空")
    @Email
    private String email;

    @NotBlank(message = "密码不能为空")
    @Length(min = 6,message = "密码长度最小为6位")
    private String password;

    @NotBlank
    @Pattern(regexp = "^A-\\d{12}-\\d{4}$",message = "格式错误")
    private String other;

}

顺便校验了一下其他的参数,最后一个other字段用来校验粉丝提出疑问的正则表达式。

然后,在创建一个Controller类:

@Slf4j
@RestController
public class LoginController {

    @PostMapping("/login")
    public void login(@Valid LoginForm loginForm, BindingResult bindingResult) {
        log.info("loginForm:{}", loginForm);
        if (bindingResult.hasErrors()) {
            for (ObjectError error : bindingResult.getAllErrors()) {
                log.info("error:{}", error.getDefaultMessage());
            }
        } else {
            log.info("参数校验成功!");
        }
    }
}

如果参数校验出错,会打印错误日志,如果校验成功则打印“参数校验成功!”。因为是Post请求,咱们就写一个针对该服务的单元测试:

@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
@AutoConfigureMockMvc
@WebAppConfiguration
public class TestLoginController {

    @Autowired
    private WebApplicationContext webApplicationContext;

    @Autowired
    private MockMvc mockMvc;

    @Before
    public void setUp() {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }

    @Test
    public void testLogin() throws Exception {
        MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/login")
                .param("email", "[email protected]")
                .param("password", "123456")
                .param("other", "A-123456789012-1234")
                .accept(MediaType.APPLICATION_JSON))
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
        int status = mvcResult.getResponse().getStatus();                 //得到返回代码
        String content = mvcResult.getResponse().getContentAsString();    //得到返回结果
        log.info("返回结果content={}", content);
        Assert.assertEquals(200, status); 
    }
}

执行打印测试,查看日志,发现校验通过,并没有出错。至此,粉丝提出的质疑并不成立。而粉丝遇到的问题,很可能是哪个细节导致了校验失败,而他总结的经验就是validation校验参数有坑。

其实这个问题在没有人相互交流的过程中更容易发生。这样是为什么技术人要有自己的圈子,要聚集起来,讨论见真知。最后,欢迎访问我的微信公众号:程序新视界,也欢迎提出更多关于疑问,大家一起进步。

原文链接:《粉丝说SpringBoot集成validation校验参数有坑,我试了试

程序新视界

公众号“ 程序新视界”,一个让你软实力、硬技术同步提升的平台,提供海量资料

微信公众号:程序新视界

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK