2012-05-10 2 views
1

리소스에 대한 부분 업데이트를 수행하려고합니다. @ModelAttribute (기존 리소스로드)와 @RequestBody를 결합하여 제공된 필드로 채운 다음 @Valid를 실행할 수 있다는 생각이 들었습니다. @ModelAttribute가 다른 것보다 먼저 호출된다는 것을 이해합니다.Spring REST 컨트롤러 부분 업데이트 기존 리소스

내 컨트롤러가 ModelAttribut을 호출하고 내 ContentPatternConverter를 사용하여 ContentPattern 엔터티를 올바르게 만듭니다. 그 후에는 @RequestBody에서 제공된 필드로 "패턴"을 채우고 마지막으로 그것이 유효한지 확인하려고합니다. 비록 ModelAttribute를 통해 만들어진 후 내 ContentPattern은 RequestBody로 채워지지 않았지만.

@RequestMapping(value = "/patterns/{id}", method = RequestMethod.PUT, produces = "application/json") 
@ResponseBody 
public ResponseEntity<ContentPattern> updateContentPattern(Principal principal, @ModelAttribute("id") @RequestBody ContentPattern pattern) { //implementation } 

모든 아이디어를 어떻게 내 접근 방식을 사용하여이 문제를 해결하는 방법 또는 다른 (더 나은) 솔루션이 있다면? 1

UPDATE 후 좀 더 내가 솔루션을 다음과 같이 와서 연구.

  1. 내 자신의 주석 @RequestBodyPathVariable
  2. 이 HandlerMethodArgumentResolver를 구현 RequestBodyPathVariableMethodArgumentResolver을 쓴 만들었습니다. 그것이하는 일은 1) URI 경로 변수 (예 : patterns/{id})를 기반으로 사용자 정의 변환기에서 기존 자원을 가져옵니다. 2) 요청 본문에서 오브젝트를 작성합니다. 3) 기존 자원과 제공된 자원을 병합합니다. 4) 최종 객체를 검증합니다. https://gist.github.com/2687913

    (더 나은/다른 병합 방법이 다른 경우에 필요)

    유용한 링크 : :. http://blog.42.nl/articles/leveraging-the-spring-mvc-3.1-handlermethodargumentresolver-interface HTTP 5) 최종 객체

페이지의 소스 코드에 대한 요점을 반환합니다 : //stackoverflow.com/questions/6591665/merging-two-objects-in-java

답변

0

나는 이것을 생각하고 있었고 여기에 내가 할 일이있다 (면책 조항, 나는 이것을 시도하지 않았다) :

먼저 @ModelAttribute은 해당 개체를보기에 전달하려는 경우에만 게재됩니다.

@RequestBody을 사용하면 Spring에서 입력 본문을 구문 분석 (예 : Json이라고 가정)하고 ContentPattern 객체를 작성할 수 있습니다. 하지만 저장소에서 해당 객체를 가져 와서 관련 필드를 업데이트하려고합니다.

먼저 WebArgumentResolver 구현을 만듭니다. MethodParameter을 사용하여 콘텐츠 패턴이 ContentPattern 클래스인지 확인합니다. 이 구현은 ContentPattern 객체를 만드는 데 사용하는 HttpMessageConverter 인 Dependency Injection으로 수신됩니다.

그런 다음이처럼 NativeWebRequest에서 HttpInputMessage를 만들 : 그런 다음 변환기를 사용하여

return new ServletServerHttpRequest((HttpServletRequest)nativeWebRequest.getNativeRequest()); 

, 당신은 당신의 ContentPattern 개체를 만듭니다. 이 개체에는 채워지는 일부 필드, 업데이트 할 필드 및 해당 식별자가 있습니다.

식별자와 저장소 또는 EntityManager 지속성 컨텍스트 (둘 다 Spring에 의해 클래스에 삽입 됨)를 사용하면 저장소에서 객체를 가져옵니다.

이제 리포지토리에서 얻은 ContentPattern 개체와 요청 본문에서 만든 ContentPattern 개체가 두 개 있습니다.

개체의 설정자를 사용하여 리포지토리의 개체를 다른 개체의 필드로 업데이트 한 다음 Validator도 Spring에서이 클래스에 주입하여 유효성을 검사합니다.

모든 것이 정상이면 선택적으로 업데이트 된 개체를 지속성에 저장하고이를 resolverArgument 메서드의 반환 값으로 사용합니다.

충분히 명확하길 바랍니다.

+0

귀하의 조언에 감사드립니다. 나는 같은 개념을 사용하면서 끝났지 만 HandlerMethodArgumentResolver를 구현했습니다. – horte