kotlin data (对应java实体类
@Entity@Table(name = "user")data class User( @NotNull(message = "用户名不能为空") @Column(name = "user_name", nullable = false) var userName: String = "", @NotNull(message = "用户ID不能为空") @Column(name = "user_id", unique = true) var userId: String = "", @Email(message = "无效的邮箱") var email: String = "", @Column(nullable = false) var passWord: String = "") : Serializable再来看controller
@RestController@RequestMapping("/user")class UserController { @Autowired lateinit var userRepository: UserRepository @PutMapping(value = "/put", consumes = arrayOf(MediaType.application_JSON_UTF8_VALUE)) @ResponseBody fun put(@Valid @RequestBody user: SysUser): ResponseEntity<SysUser>? { if (result.hasErrors()) { val fieldErrors = result.fieldErrors for (fieldError in fieldErrors) { PRintln("${fieldError.defaultMessage}") } return fieldErrors } println(user) return ResponseEntity .ok() .cacheControl(CacheControl.maxAge(30, TimeUnit.DAYS)) .eTag("AC") .body(user) }}调用put方法,@Valid
校验无效
原因分析:
在 java 中,将 validation 注解到实体类属性或者 get/set 方法上,但是在 kotlin 中,属性直接写在构造函数中,validation 注解并没有作用到属性上。
解决方法:
使用 @field:
标识符,field
标识符只允许在属性的访问器函数内使用。它能够 validation 校验注解作用与属性。
将 kotlin data class 稍作修改:
@Entity@Table(name = "user")data class User( @field:NotNull(message = "用户名不能为空") @Column(name = "user_name", nullable = false) var userName: String = "", @field:NotNull(message = "用户ID不能为空") @Column(name = "user_id", unique = true) var userId: String = "", @field:NotBlank(message = "邮箱不能为空") @field:Email(message = "无效的邮箱") var email: String = "", @field:NotBlank(message = "密码不能为空") @Column(nullable = false) var password: String = "") : Serializable之后,@Valid
校验即可正常工作
再次执行
curl -v http://localhost:8080/user/put看到错误信息
{ "timestamp": "2017-03-04 13:54:19", "status": 400, "error": "Bad Request", "exception": "org.springframework.web.bind.MethodArgumentNotValidException", "errors": [ { "field": "userId", "rejectedValue": null, "bindingFailure": false, "objectName": "sysUser", "codes": [ "NotNull.sysUser.userId", "NotNull.userId", "NotNull.java.lang.String", "NotNull" ], "arguments": [ { "codes": [ "sysUser.userId", "userId" ], "arguments": null, "defaultMessage": "userId" } ], "defaultMessage": "用户ID不能为空" } ], "message": "Validation failed for object='sysUser'. Error count: 1", "path": "/user/put"}新闻热点
疑难解答