服务器端验证似乎在 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 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot2 系列教程 (十五) | 服务端参数校验之一
如何使用 Spring Boot jwt 将身份验证系统连接到 React.js