2016-07-22 17 views
7

Şöyle bir dinlenme denetleyicisi vardır:Java Manuel Doğrulama

@RequestMapping(
     value = "/foo", 
     method = RequestMethod.POST) 
@ResponseBody 
public ResponseEntity<JsonNode> getFOOs(@Valid Payload payload) { 
    /** some code **/ 
} 

Payload sınıf şuna benzer:

@OneOrTheOther(first = "a", second = "b") 
public final class Payload { 
    private final String userName; 
    private final String a; 
    private final String b; 
    @NotNull 
    private final String c; 
    @NotEmtpy{message="At least 1 item"} 
    private List<String> names = new ArrayList<String>(); 
} 

Ve ArgumentResolver şuna benzer:

public class PayloadArgumentResolver implements HandlerMethodArgumentResolver { 
    @Override 
    public boolean supportsParameter(MethodParameter methodParameter) { 
     return methodParameter.getParameterType().equals(Payload.class); 
    } 

    @Override 
    public Object resolveArgument(MethodParameter methodParameter, 
            ModelAndViewContainer modelAndViewContainer, 
            NativeWebRequest nativeWebRequest, 
            WebDataBinderFactory webDataBinderFactory) throws Exception { 
     if(supportsParameter(methodParameter)) { 
      HttpServletRequest requestHeader = nativeWebRequest.getNativeRequest(HttpServletRequest.class); 
      String userName = requestHeader.getHeader("userName"); 

      ObjectMapper mapper = new ObjectMapper(); 
      JsonNode requestBody = mapper.readTree(CharStreams.toString(requestHeader.getReader())); 

      JsonNode a = requestBody.path("a"); 
      String a = a.isMissingNode() ? null : a.asText(); 

      JsonNode b = requestBody.path("b"); 
      String b = b.isMissingNode() ? null : b.asText(); 

      JsonNode c = requestBody.path("c"); 
      String c = c.isMissingNode() ? null : c.asText(); 

      JavaType type = mapper.getTypeFactory().constructCollectionType(ArrayList.class, String.class); 
      List<String> ids 
        = requestBody.path("ids").isMissingNode() 
        ? null : mapper.readValue(requestBody.path("ids").toString(), type); 


      return new Payload(username, a, b, c, ids); 
     } 
     return null; 
    } 
} 

Şu anda bunu yapmak istediğimin yaklaşık% 95'ini yapıyor. Başlıkta tüm öğeleri başarıyla alır ve gövde isteğinde bulunur ve Payload nesnesini oluşturur. Ancak, nesneyi oluşturduktan sonra, sınıfındaki NotNull, NotEmpty veya müşteri doğrulama aracısı OneOrTheOther gibi açıklamaları çalıştırmak istiyorum.

Bazı kazma yaptım ve birkaç yığın makale here ve here. İlkini nasıl uygulayacağımı bilmiyorum ve ikincisi aşırı karmaşık ve hantal görünüyor, bu yüzden o rotaya gitmek istemiyorum. validateIfApplicable yöntemini kullanmanın yolu gibi görünüyor, ancak bağlamımda nasıl arayabilirim?

+0

aşağıdaki http bakın: // stackoverflow.com/questions/18091936/spring-mvc-valid-validation-with-custom-handlermethodargumentresolver?noredirect=1&lq=1 –

+0

Belki de taleplerinizi karşılamak için daha kolay olan Spring3'ün JSR-303 doğrulamasını kullanabilirsiniz ve ArgumentResolver gerekli değil. – TTCC

cevap

2

Sınıfınıza bir SmartValidator örneği ekleyebilirsiniz. Sadece ekleyin:

@Autowired 
SmartValidator payloadValidator; 

kez enjekte, sadece fasulye ve hata listesini geçirerek, üzerinde doğrulama yöntemi çağırmak zorunda. Başvuru için

:

SmartValidator: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/validation/SmartValidator.html

Erros: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/validation/Errors.html

1

Size bu doğrulamalar doğru nesnenin oluşturulduktan sonra çalıştırılacak istediğiniz anlamına gelir. Bu durumda o zaman (methodthat döner nesne) sizin nesne döndürür yöntemine @Pointcut oluşturabilir ve hangi @AfterReturning istediğiniz doğrulamaları arayacak

 @Pointcut("execution(* YourClass.*(..))") 
    public void pointcut(){} 

    @AfterReturning("method that returns object") 
    public final class Payload { 
     private final String userName; 
     private final String a; 
     private final String b; 
    }