2012-11-03 2 views
1

요청 XML이 포함 된 문자열을 @RequestBody로받는 컨트롤러가 있습니다.Spring REST MVC : 형식을 사용하지 않고 들어오는 XML 유효성 확인

@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. 모든 컨트롤러는 클래스를 명시 적으로 나타내는 하나 이상의 유효성 검사기와 연결됩니다. 스프링 MVC는 JAXB의 Unmarshaller에 전화를 돌보는와

    @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(); 
    } 
    

    :

답변

1

완전히 스프링 MVC에서 처리 할 수있는 수동으로하고있는 많은,이 구조에 당신의 방법을 얻을 수 있어야합니다 유효성 검사를 담당하는 유형에 대한 주석 (@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"/> 
를 예를 들어 다른 유효성 검사기에
관련 문제