Pra*_*ick 5 java cxf hibernate-validator spring-boot
我正在使用 spring boot 2.0.6、hibernate validator 6.0、validation-api 2.0 和 apache cxf。我在控制器方法中使用了 @Valid 注释,然后在 bean 属性中设置了 @NotNull、@Email 和正确的消息。然后我创建了一个 CustomExceptionHandler 来处理 MethodArgumentNotValidException。在邮递员测试它时,我的验证消息没有得到正确的响应。
用户控制器类
@Path("/user")
@Component
public class UserController {
@POST
@Path("/register")
@Consumes(MediaType.APPLICATION_JSON_VALUE)
@Produces(MediaType.APPLICATION_JSON_VALUE)
public Response registerUser(@Valid User user) {
String status = "";
Boolean isEmailIdExist = UserAuthService.checkUserByMailId(user.getEmail());
Boolean isUserNameExist = UserAuthService.checkUserByUserName(user.getUserName());
if(!isEmailIdExist) {
if(!isUserNameExist) {
status = UserAuthService.registerUser(user);
}else {
status = "Username already taken. Try with different name";
}
}else {
status = "Email ID already exist";
}
return Response.ok(status).build();
}
}
Run Code Online (Sandbox Code Playgroud)
用户类
@Entity
@Table(name = "USER")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "UID")
private int userId;
@NotBlank(message = "Please provide first name")
@Column(name = "FIRST_NAME", length = 50)
private String firstName;
@NotBlank(message = "Please provide email")
@Column(name = "EMAIL", length = 100, unique = true)
@Email(message = "Please provide a valid email")
private String email;}
getter/setter
}
Run Code Online (Sandbox Code Playgroud)
CustomExceptionHandler.java
@ControllerAdvice
@Component
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(Exception.class)
public final ResponseEntity<Object> handleAllExceptions(Exception ex, WebRequest request) {
ErrorDetails errorDetails = new ErrorDetails(new Date(), ex.getMessage(), request.getDescription(false));
return new ResponseEntity<Object>(errorDetails, HttpStatus.INTERNAL_SERVER_ERROR);
}
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers, HttpStatus status, WebRequest request) {
ErrorDetails errorDetails = new ErrorDetails(new Date(), "Validation Failed", ex.getBindingResult().toString());
return new ResponseEntity<Object>(errorDetails, HttpStatus.BAD_REQUEST);
}
}
Run Code Online (Sandbox Code Playgroud)
Json结构
{
"firstName":"",
"email":"prakashkumar@xyz.com",
}
Run Code Online (Sandbox Code Playgroud)
如果您遇到以下问题:无法看到返回给客户端的验证错误(默认消息),您可以执行以下操作:
最佳解决方案 1: 只需添加 devtools。这应该可以解决问题。完成此操作后,我所有的绑定结果都返回给客户端。我建议您先测试一下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
解决方案2:
我发现这是由于使用 Spring Boot 2.3+ 因此,如果您使用 Spring Boot 2.3 或更高版本,请在 pom.xml 文件中添加此依赖项,因为它不再包含在“web”依赖项本身中。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
现在有必要将java/resources/application.properties中的“包含绑定错误”设置为“始终”。“消息”也是如此,尽管我认为这是可选的。
server.error.include-message=always
server.error.include-binding-errors=always
Run Code Online (Sandbox Code Playgroud)
解决方案 3:(在我发现解决方案 2 也可能有帮助之前)
所以我发现这是由于 Spring boot 2.3+ 造成的。但我找不到有关 Spring Boot v2.3+ 中 @Valid 的新更新用法的警告消息。
因此,我最终通过调整 pom.xml 文件中的发布版本切换回 Spring boot v2.2.10(2.2 的最新版本),如下所示:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
Run Code Online (Sandbox Code Playgroud)
通过回滚到旧版本,这对我来说非常有效。虽然我想有一天更新我的 Spring Boot 版本。(重新审视解决方案 1 和 2)
| 归档时间: |
|
| 查看次数: |
2311 次 |
| 最近记录: |