服务器端验证似乎在 Spring Boot 2.3.1.RELEASE 中不起作用

Posted

技术标签:

【中文标题】服务器端验证似乎在 Spring Boot 2.3.1.RELEASE 中不起作用【英文标题】:Server Side validation doesnt seems to work in SpringBoot 2.3.1.RELEASE 【发布时间】:2020-10-10 11:16:56 【问题描述】:

我有一个 POJO 类及其 API 方法。我想验证用户字段输入,但它似乎不起作用。我在 POJO 类中使用了 @Size() 注释,但它不起作用。下面是我的逻辑结构的sn-p。

POJO 类

@Entity
public class Address 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long addressId;

    @NotNull
    @Size(min=10, max=100, message="Please enter between min-max characters")
    private String addressLine;

API 类方法

@PostMapping(value="/add", produces = MediaType.APPLICATION_JSON_VALUE, consumes=MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody String addAddress( @RequestBody @Valid Address address, BindingResult result)
    
        if(result.hasErrors()) 
            return ErrorUtils.customErrors(result.getAllErrors());
         else 
            return addressService.addAddress(address);
        
    

我正在为 addAddress (/add) 方法创建 JSON 请求,并在 UI 表单中提示错误。我的 JSON 响应处理程序位于 jquery 验证器中,如下所示..

function saveRequestedData(frm, data, type) 
    $.ajax(
        contentType:"application/json; charset=utf-8",
        type:frm.attr("method"),
        url:frm.attr("action"),
        dataType:'json',
        data:JSON.stringify(data),
        success:function(data) 
            if(data.status == "success") 
            alert(data.message);
            toastr.success(data.message, data.title, 
                closeButton:true
            );
            fetchList(type);
            
            else 
                toastr.error(data.message, data.title, 
                    allowhtml:true,
                    closeButton:true
                );
            
        
    );
   

似乎只有@NotNull 似乎工作而不是@Size 和@Valid 注释。 根据 Spring Boot 发布说明,从版本 2.3.0.RELEASE Spring Boot Web 和 WebFlux 启动器不再依赖于验证启动器,所以我在我的 pom 中添加了 spring-boot-starter-validation .xml 手动。 但似乎没有任何效果。

【问题讨论】:

你在班级级别添加了@Validated 吗? @SSK 我没有,因为我已经在 API 类方法中提到了@Valid。但是我也尝试了您的建议,方法是在我的控制器类级别中使用@Validation。但它没有用。 这是来自org.springframework.validation.annotation.Validated;@Validated @SSK 使用了@validated,但它没有像这样工作 --> @Controller @RequestMapping("add") @Validated public class AddressController 您需要在班级级别使用它。添加代码作为参考答案 【参考方案1】:

您可以使用以下代码作为参考。

@Validated
@RestController
public AddressController

@Autowired
private AddressService addressService;

@PostMapping(value="/add", produces = MediaType.APPLICATION_JSON_VALUE, consumes=MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody String addAddress( @RequestBody @Valid Address address, BindingResult result)
        if(result.hasErrors()) 
            return ErrorUtils.customErrors(result.getAllErrors());
         else 
            return addressService.addAddress(address);
        
    
 

【讨论】:

非常感谢您的回复。我让它使用相同的代码。而且我没有使用@Validated。相反,我调试了应用程序,在调试时我发现逻辑是正确的,但我没有提供完整和正确的用户输入长度来启用来自 spring 框架的错误消息。 很高兴知道您找到了根本原因。坚持下去。

以上是关于服务器端验证似乎在 Spring Boot 2.3.1.RELEASE 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

springboot 服务端表单验证

springboot 服务端表单验证

Spring Boot2 系列教程 (十五) | 服务端参数校验之一

如何使用 Spring Boot jwt 将身份验证系统连接到 React.js

Spring Boot构建的Web项目如何在服务端校验表单输入

基于 Angular 角色的身份验证密钥斗篷和 Spring Boot