0

コントローラーに次の GET リクエストがあります。

@Controller
public class TestController {

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.setValidator(new ProfileTokenValidator());
    }

    @RequestMapping(value = "/more/{fromLocation:.+}/to/{toLocation:.+}", method = RequestMethod.GET)
    @ResponseBody
    public void copyProfile(@PathVariable @Valid String fromLocation, @PathVariable String toLocation) {
    ...
    }
}

そして、文字列 fromLocation の単純なバリデーターがあります

public class ProfileTokenValidator implements Validator{

    @Override
    public boolean supports(Class validatedClass) {
        return String.class.equals(validatedClass);
    }

    @Override
    public void validate(Object obj, Errors errors) {
        String location = (String) obj;

        if (location == null || location.length() == 0) {
            errors.reject("destination.empty", "Destination should not be empty.");
        }
    }

}

fromLocation が toLocation と同じ場合、ケースの検証を提供する必要があるという問題。アドバイスか何かを手伝ってください.Getリクエストで両方のパラメータを同時にチェックするバリデータを書く方法はありますか? ありがとう。

引用符

4

1 に答える 1

0

それは悪い考えでした。別の方法で、パラメーターを検証するコントローラーで簡単なメソッドを作成しました。何か問題がある場合は、特別な例外がスローされ、記述されたハンドラーによって処理されます。このハンドラは、400 ステータスの不正なリクエストと、スローする前に定義されたメッセージを返します。したがって、カスタムバリデータとまったく同じように機能します。このリンクの記事が大きな助けになりましたhttp://doanduyhai.wordpress.com/2012/05/06/spring-mvc-part-v-exception-handling/

そして、以下は私のコードです:

@Controller
public class TestController {

    @RequestMapping(value = "/more/{fromLocation:.+}/to/{toLocation:.+}", method = RequestMethod.GET)
    @ResponseBody
    public void copyProfile(@PathVariable String fromLocation, @PathVariable String toLocation) {
        validateParams(fromLocation, toLocation);
        ...
    }

    private void validateParams(String fromLocation, String toLocation) {
        if(fromLocation.equals(toLocation)) {
            throw new BadParamsException("Bad request: locations should differ.");
        }
    }

    @ExceptionHandler(BadParamsException.class)
    @ResponseStatus(value = HttpStatus.BAD_REQUEST)
    @ResponseBody
    public String handleBadParamsException(BadParamsException ex) {
        return ex.getMessage();
    }

    @ResponseStatus(value = HttpStatus.BAD_REQUEST)
    public static class BadParamsException extends RuntimeException {
        public BadParamsException(String errorMessage) {
            super(errorMessage);
        }
    }
}
于 2012-11-23T10:37:00.400 に答える