【问题标题】:Server Side validation doesnt seems to work in SpringBoot 2.3.1.RELEASE服务器端验证似乎在 Spring Boot 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 {
  • 您需要在班级级别使用它。添加代码作为参考答案

标签: jquery spring-boot validation


【解决方案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 框架的错误消息。
  • 很高兴知道您找到了根本原因。坚持下去。
猜你喜欢
  • 2014-12-23
  • 1970-01-01
  • 2021-11-02
  • 2020-02-25
  • 2014-07-10
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多