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はインターフェイスであるため、インスタンス化できません。唯一の選択肢は、 を実装するクラスの 1 つを使用することErrorsです。

org.springframework.validation.BindExceptionこの実装を使用できます。詳細については、Errorsこちらを参照してください

于 2012-10-03T18:11:37.573 に答える
1

org.springframework.validation.BindingResultこれが Spring MVC アプリケーションであり、@Controllers を使用している場合、検証オブジェクトを次のようなマッピングの一部として渡すことができます。

@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 に答える
1

クラス オブジェクトをインスタンス化できます。ただしErrors、クラスではなくインターフェイスです。したがって、しようとしているようにインスタンス化することはできません。

于 2012-10-03T18:09:27.357 に答える
0

メソッドは、インターフェイスを実装するオブジェクトを期待していErrorsます。Errors インターフェースを実装するすべてのクラスが機能します。などの既存のクラスを使用したくない場合はorg.springframework.validation.BindException、匿名内部クラスを使用できます。をすでに実装している既存のクラスについては、Spring Docsを参照してくださいErrors。ただし、匿名クラスはすべてのインターフェイス メソッドを実装する必要があります。これは非常に多く、コードがますます読みにくくなります。

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

ほとんどの場合、開発者は投稿されたオブジェクトまたは新しいオブジェクトを検証するため@Validに とを使用します。BindingResultたとえば、次のコードでは、注釈を介して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 の優れた利点の 1 つですが、他のレイヤーでも同じ動作が必要になる場合があります。したがって、BindingResult の実装された形式のインスタンスを取得し、バリデーターをコードに挿入する必要があります。

...
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 に答える