在Java web开发过程中,经常需要从前端获取参数到服务端,服务端预设的变量接收的值可能为正确的值,也可能是空字符串或者是null。对于变量接收的值,我们希望能够在接收值的时候进行控制,而不是在代码中处理的时候报各种奇怪的错误。
方法一:在控制层中对于接收参数添加@RequestParam
举个栗子:
@RestController
@RequestMapping("/v1")
public class HelloController {
@GetMapping(value = {"/test_param"})
public String testParam(@RequestParam(value = "search", required = false, defaultValue = "") String search) {
return "Get方式请求的的参数search为:" + search;
}
}
测试效果为:
(1)当输入search具体的参数时,能够正确的显示具体的参数
(2)当不输入search参数时,会输出空字符串,而不是null。
方法二:利用springframework提供的继承Java校验API提供的校验注解@Valid的@Validated
由于@Validated是基于@Valid,因此@Valid的用法不在这里介绍。
举个栗子:
1、一个简单的POJO类UserInfo如下:
import org.hibernate.validator.constraints.NotBlank;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class UserInfo {
@NotNull(message = "用户名不能为null")
@Size(min = 5, max = 10, message = "用户名必须是5到10个字符")
private String userName;
@NotNull(message = "性别不能为null")
private String sex;
@NotNull(message="年龄不能为null", groups = {HelloGroup.class})
@Max(value = 120, message = "年龄不能超过120")
private Integer age;
@NotBlank(message = "地址不能为空字符串或者null")
private String address;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "UserInfo{" +
"userName='" + userName + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
分析:
(1)区别@NotNull和@NotBlank
@NotNull表示不能为null,如果传入的是空字符串则是合法的。而@NotBlank表示既不能为null也不能为空字符串,显然@NotBlank的用法更常见。
(2)在注解中显示的写明(message=“对具体的注解进行解释的语句”)
便于在控制层校验的时候返回错误的信息(后面补充控制层的写法)
(3)@Size的用法用来控制字符串的长度
(4)注意:这里的groups={HelloGroup.class}有点类似给这个注解打了标签进行分组,HelloGroup是个接口,定义如下:
public interface HelloGroup { }
在控制层中,显示的指定要的分组。(注意:如果没有指定任何分组,则早控制层是扣除了分组剩余的注解校验的参数)
2、控制层的写法如下:
配合上面的例子如下:
@RestController
@RequestMapping("/v1")
public class HelloController {
@GetMapping(value = {"/test_param"})
public String testParam(@Validated UserInfo userInfo, BindingResult bindingResult) {
if(bindingResult.hasErrors()) {
StringBuffer sb = new StringBuffer();
for(ObjectError objectError:bindingResult.getAllErrors()) {
// sb.append(((FieldError)objectError).getField() + ":").append(objectError.getDefaultMessage());
sb.append(objectError.getDefaultMessage()).append(" ");
}
return sb.toString();
}
return "Get方式请求的的参数userInfo为:" + userInfo.toString();
}
}
输出的效果如下:
与切面编程结合后期待补充。