如何在Spring Boot中手动启用来自ModelAttribute和BindingResult的错误消息?

问题描述

具有一个具有保存记录功能的控制器:

@PostMapping("/create")
public String create(
    @Valid @modelattribute NewShoeviewmodel newShoeviewmodel,BindingResult bindingResult
)
{
    ...
}

问题是服务层是由另一个人开发的,并使用DTO对象创建新记录,并且该记录具有验证注释,例如,要知道鞋子的名称是否为空白,则问题是从我的视图模型开始的,我也进行了相同的验证,但是如果视图模型与DTO验证不匹配,则服务层会抛出验证异常。

要处理这些错误,如果服务告诉我名称的非法长度与我的视图模型的非法长度不同,则应处理该错误,现在,我将按照以下步骤进行操作:

@PostMapping("/create")
public String create(
    @Valid @modelattribute NewShoeviewmodel newShoeviewmodel,BindingResult bindingResult,Locale locale,// ...
)
{
    // ...

    try
    {
        shoesService.create(shoeDTO);
    }
    catch (ConstraintViolationException exception)
    {
        // ...
        
        if(/* name have a bad length from Service DTO */)
        {
            // Custom binding throw
            bindingResult.rejectValue(
                "name","error.name.length",messageSource.getMessage(
                    "messages.shoes.name.bad_length",null,locale
                )
            );
        }
    }
    //...
}

问题是几个,首先,控制器不应该处理错误消息,viewmodel已经包含了自己的由BindingResult处理的消息:

public class NewShoeviewmodel implements Serializable
{
    @NotEmpy
    @Size(min=3,max=128,message="{messages.shoes.name.bad_length}")
    private String name;

我如何获得验证以说名称字段失败,但是没有从控制器发送文本并且调用大小错误而不是空错误?只需通过手动使验证失败,这种方式就可以将服务DTO错误传递给viewmodel错误。在官方文档中,rejectValue需要使用认的信息,但需要回收viewmodel消息,例如:

但保留原始信息和viewmodel验证代码

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)