2013-11-22 2 views
1

스프링 컨트롤러 정의에서 도움말을 찾고 있습니다. 나는 몇 번 구글을 시도했지만, 나의 목표를 성취하는 방법에 대한 직접적인 설명을 발견하지 못했습니다.요청 매개 변수를 일반 클래스로 변환

나는 일반적인 컨트롤러를 정의하고 싶습니다 : 그 후

public abstract class AbstractController<E extends AbstractEntity, 
             P extends IRequestParams> { 
    @RequestMapping(method = GET) 
    public @ResponseBody 
    abstract List<E> list(@RequestParam P params); 
} 

을 내가 좋아하는 컨트롤러를 선언합니다 :

public class CatController 
      extends AbstractController<Cat, ICatSearchParams> { 
    @RequestMapping(method = GET) 
    public @ResponseBody 
    List<Cat> list(@RequestParam ICatSearchParams params) { 
    // do something and return list of results 
    } 
} 

나는 일반적인 방법으로 IRequestParams@RequestParam Map<String, String[]> params 변환 서비스가있다. Spring을 통해 제네릭 형식을 해결할 수 있습니다.

하지만 Spring에 연결하여 요청 매개 변수를 자동으로 params 인터페이스로 변환하고 메서드 호출에 사용하는 방법을 모르겠습니다. 이 변환은 개발자가 구성한 후에 투명하게 보이기를 바랍니다.

도움을 주셔서 감사합니다.

+0

봄'변환기'또는'WebArgrumentResolver'가 제네릭 형식을 올바르게 해석 할 수 있는지 모르겠으므로 전체 구조가 결국 작동하는지 확실하지 않습니다. – Ralph

답변

1

HandlerMethodArgumentResolver을 구현할 수 있지만 자신이 전체 개체 매핑을 구현해야합니다.

등록은 간단합니다 :

<mvc:annotation-driven> 
     <mvc:argument-resolvers> 
      <bean class="YourMethodArgumentResolver"/>   
     </mvc:argument-resolvers> 
</mvc:annotation-driven> 

다른 방법은 사용자 정의 Converter를 구현하는 것입니다. 주된 문제는 변환기가 하나의 단일 문자열/요청 속성 만 변환 할 수 있다는 것입니다. 그러나 IRequestParams이 둘 이상의 값으로 http 요청에 있으면 작동하지 않습니다. - 반면에 변환기가 ID로 엔티티를로드하도록 설계된 경우 Converter이 좋습니다.

당신은 그때 질문의 목표를 acomplished 한 https://stackoverflow.com/a/13778502/280244

1

이 답변을 살펴이 자동으로 방법을 빌드 변환기를 등록합니다. @Ralph's 대답은 매우 매우 도움이되었지만, 더 정확하게 필요한 것이 무엇인지 쓸 것입니다.

HandlerMethodArgumentResolver을 작성했으며 이름은 CustomHandlerMethodArgumentResolver입니다. 모든 요청 매개 변수를 결과 개체에 매핑하려면 컨트롤러의 메서드 매개 변수를 @RequestBody으로 표시해야했습니다.

스프링의 기본값 HandlerMethodArgumentResolvers이 먼저 매핑하려고 했으므로 충분하지 않았습니다. 리졸버가 실행되지 않았습니다. 그러나 this 대답은 내 결정자에게 우선 순위를 설정하는 방법을 지적했습니다.

@PostConstruct 왜 작동하지 않습니까? ApplicationListener<ContextRefreshedEvent>을 구현하기 위해 @Configuration 클래스를 수정했습니다. 여기에 코드입니다 : 물론 실제 상황은 사용자 정의 또는 기본 방식으로 처리 할 필요가있는 경우 CustomHandlerMethodArgumentResolver.supportsParameter(MethodParameter) 검사의

@Override 
public void onApplicationEvent(ContextRefreshedEvent event) { 
    RequestMappingHandlerAdapter adapter = 
     event.getApplicationContext().getBean(
      RequestMappingHandlerAdapter.class); 
    CustomHandlerMethodArgumentResolver resolver = 
     event.getApplicationContext().getBean(
      CustomHandlerMethodArgumentResolver.class); 

    List<HandlerMethodArgumentResolver> argumentResolvers = 
     new ArrayList<>(
      adapter.getArgumentResolvers().getResolvers()); 
    List<HandlerMethodArgumentResolver> customResolvers = 
     adapter.getCustomArgumentResolvers(); 
    argumentResolvers.remove(resolver); 
    argumentResolvers.add(0, resolver); 
    adapter.setArgumentResolvers(argumentResolvers); 
} 

- 요구 사항에 따라 달라집니다.

번개 빠른 도움을 주셔서 감사합니다. @Ralph!

관련 문제