31

我有这样的方法:

public boolean validateMessage(String message, Errors errors) {
  if (!StringUtils.hasLength(message)) {
    errors.rejectValue(wrapperName + "message", "EMPTY_MESSAGE", EMPTY_MESSAGE_ERRORMSG) ;
            return false ;
        }
        return true ;
    }

我想用一个新Errors对象调用这个方法,比如:

boolean result = validateMessage("hi", new Errors()) ;

但是,这种实例化是不允许的Errors。请指教。

如果没有Errors,我可以使用空(新)来实现吗BindingResult

4

7 回答 7

22

Errors并且BindingResult是接口,因此它们不能被实例化。您唯一的选择是使用实现Errors.

您可以使用org.springframework.validation.BindException,这个工具Errors-请参阅此处了解详细信息

于 2012-10-03T18:11:37.573 回答
19

另一种选择是使用 org.springframework.validation.BeanPropertyBindingResult,它实现了 Errors。此对象与您在 Spring MVC 控制器中收到的 BindingResult 属于同一类

Errors errors = new BeanPropertyBindingResult(objectToValidate, "objectName");
于 2016-03-02T11:44:56.923 回答
2

首先,您不能初始化 Errors 对象,因为这是一个接口。

我正在尝试为我的 JUnit 测试用例初始化 Errors 对象。Spring中有许多可用的错误实现,(我在下面附上了一张图片)。

我试过new EscapedErrors(null)了,但它的构造函数本身需要传递 Errors 对象。

解决方案: 的构造函数org.springframework.validation.BeanPropertyBindingResult如下所示:

public BeanPropertyBindingResult(Object target, String objectName) {
        this(target, objectName, true, Integer.MAX_VALUE);
    }

所以对我来说,Errors errors = new BeanPropertyBindingResult(new Object(), "dummy");就像一个魅力。

在此处输入图像描述

于 2018-10-03T04:22:29.830 回答
1

您可以实例化类对象。但是Errors是一个接口,而不是一个类。因此,它不能像您尝试做的那样实例化。

于 2012-10-03T18:09:27.357 回答
1

如果这是一个 Spring MVC 应用程序并且您正在使用 @Controllers,您可以将验证对象org.springframework.validation.BindingResult作为映射的一部分传递,如下所示:

@RequestMapping(value="login.htm", method=RequestMethod.POST)
public String doLogin(HttpServletRequest request, Model model, BindingResult errors) {
    // ..... some validation code

    String message = "My message";
    boolean valid = validateMessage(message, errors); 

    // .... some more code
}

这是显式实例化的另一种方法org.springframework.validation.Errors

于 2016-05-12T13:40:40.050 回答
0

该方法需要一个实现Errors接口的对象。任何实现 Errors 接口的类都可以工作。如果您不想使用现有的类,例如org.springframework.validation.BindException,可以使用匿名内部类。有关已经实现的现有类,请参阅Spring DocsErrors。但是你的匿名类需要实现所有的接口方法,这些方法非常多,使你的代码越来越难以阅读:

boolean result = validateMessage( "hi", new Errors() {

        @Override
        public void setNestedPath(String nestedPath) {
            // TODO Auto-generated method stub

        }

        @Override
        public void rejectValue(String field, String errorCode, Object[] errorArgs, String defaultMessage) {
            // TODO Auto-generated method stub

        }

        @Override
        public void rejectValue(String field, String errorCode, String defaultMessage) {
            // TODO Auto-generated method stub

        }

        @Override
        public void rejectValue(String field, String errorCode) {
            // TODO Auto-generated method stub

        }

        @Override
        public void reject(String errorCode, Object[] errorArgs, String defaultMessage) {
            // TODO Auto-generated method stub

        }

        @Override
        public void reject(String errorCode, String defaultMessage) {
            // TODO Auto-generated method stub

        }

        @Override
        public void reject(String errorCode) {
            // TODO Auto-generated method stub

        }

        @Override
        public void pushNestedPath(String subPath) {
            // TODO Auto-generated method stub

        }

        @Override
        public void popNestedPath() throws IllegalStateException {
            // TODO Auto-generated method stub

        }

        @Override
        public boolean hasGlobalErrors() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean hasFieldErrors(String field) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean hasFieldErrors() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean hasErrors() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public String getObjectName() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public String getNestedPath() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public List<ObjectError> getGlobalErrors() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public int getGlobalErrorCount() {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public ObjectError getGlobalError() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public Object getFieldValue(String field) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public Class getFieldType(String field) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public List<FieldError> getFieldErrors(String field) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public List<FieldError> getFieldErrors() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public int getFieldErrorCount(String field) {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public int getFieldErrorCount() {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public FieldError getFieldError(String field) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public FieldError getFieldError() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public int getErrorCount() {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public List<ObjectError> getAllErrors() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public void addAllErrors(Errors errors) {
            // TODO Auto-generated method stub

        }
    } );
于 2012-10-03T18:17:23.063 回答
0

大多数时候,开发人员使用@ValidBindingResult验证发布的或新的对象。例如,在下面的代码中,通过注释验证Category对象@Valid,然后将其结果与BindingResult. 但是所有这些步骤都是Spring自动完成的。

@PostMapping
public String saveCategory(@Valid Category category, BindingResult bindingResult)
{
    // if there are some errors
    if (bindingResult.hasErrors())
    {
        for (ObjectError objectError : bindingResult.getAllErrors())
        {
            System.out.println(objectError.getDefaultMessage());
        }
    }

    ...
}

尽管上述代码片段是 Spring 的突出优势之一,但有时您希望在其他层中具有相同的行为。因此,您必须获取 BindingResult 的实现形式的实例并将 Validator 注入到您的代码中:

...
import org.springframework.validation.Validator;
...

@Service
public class CategoryService
{

    @Autowired
    private Validator validator;
    ...

    private void insertNewCategory(Category category)
    {
        BindingResult bindingResult = new BeanPropertyBindingResult(category, "objectName");
        validator.validate(category, bindingResult);
        if(bindingResult.hasErrors())
        {
            for (FieldError fieldError : bindingResult.getFieldErrors())
            {
                System.out.println(fieldError.getDefaultMessage());
            }
        }
    ....
    }
}
于 2021-08-21T06:22:29.077 回答