1

リクエストXMLを含む文字列を@RequestBodyとして受け取るコントローラーがあります。

@RequestMapping(method = RequestMethod.POST, value="/app-authorization")
public Response getAppAuthorization(
        HttpServletResponse response, BindingResult results,
        @RequestBody String body){
    log.info("Requested app-authorization through xml: \n" + body);

    Source source = new StreamSource(new StringReader(body));
    RefreshTokenRequest req = (RefreshTokenRequest) jaxb2Mashaller.unmarshal(source);

    validator.validate(req, results);
    if(results.hasErrors()){
        log.info("DOESN'T WORK!");
        response.setStatus(500);
        return null;
    }
    InternalMessage<Integer, Response> auth = authService.getRefreshToken(req);
    response.setStatus(auth.getHttpStatus());
    return auth.getReponse();
}

AuthorizationValidatorは次のとおりです。

@Component("authenticationValidator")
public class AuthenticationValidator implements Validator{

    public boolean supports(Class<?> clazz) {
        return AuthorizationRequest.class.isAssignableFrom(clazz);
    }

    public void validate(Object target, Errors errors) {
        errors.rejectValue("test", "there are some errors");

    }
}

次のような方法でオブジェクトバリデーターをコントローラーに挿入する方法があるかどうかを知りたいのですが。

  1. @Autowired\nバリデーターバリデーター; AuthenticationValidatorへの参照を自動的に取得します
  2. すべてのコントローラーは、クラスを明示的に示すことなく、1つ以上のバリデーターにリンクされています。
4

1 に答える 1

1

手動で行っていることの多くはSpringMVCで完全に処理できるため、メソッドをこの構造に変換できるはずです。

@RequestMapping(method = RequestMethod.POST, value="/app-authorization")
public Response getAppAuthorization(@Valid @RequestBody RefreshTokenRequest req, BindingResult results){

    if(results.hasErrors()){
        log.info("DOESN'T WORK!");
        response.setStatus(500);
        return null;
    }
    InternalMessage<Integer, Response> auth = authService.getRefreshToken(req);
    response.setStatus(auth.getHttpStatus());
    return auth.getReponse();
}

Spring MVCがJAXBアンマーシャラーの呼び出しを処理@Validし、型のアノテーションが検証を処理します。

タイプのカスタムバリデーターを登録するには、次のようにします。

@InitBinder
protected void initBinder(WebDataBinder binder) {
    binder.setValidator(this.authenticationValidator );
}

特定のコントローラーではなくグローバルに設定する場合は、カスタムグローバルバリデーターを作成して、他のバリデーターに内部的に委任できます。例:

public class CustomGlobalValidator implements Validator {

    @Resource private List<Validator> validators;

    @Override
    public boolean supports(Class<?> clazz) {
        for (Validator validator: validators){
            if (validator.supports(clazz)){
                return true;
            }
        }
        return false;
    }

    @Override
    public void validate(Object obj, Errors e) {
        //find validator supporting class of obj, and delegate to it

    }
}

このグローバルバリデーターを登録します。

<mvc:annotation-driven validator="globalValidator"/>
于 2012-11-03T20:52:45.663 に答える