2016-04-19 8 views
0

私は例えば、残りのパラメータを保持している複雑な豆を持っている:複雑なRestController beanにHttpServletRequest paramを追加するには?

public class MyRestParams { 
    private HttpServletRequest req; 
    private @NotBlank String name; 

    //getter, setter 
} 

使用法:

@RestController 
@RequestMapping("/xml") 
public class MyServlet { 
    @RequestMapping(value = "/") 
    public void getTest(@Valid MyRestParams p) { 
     Sysout(p.getName()); //works when invoked with /xml?name=test 
     Sysout(p.getReq()); //always null 
    } 
} 

問題:HttpServletRequestは常にnullです。 Bean自体の内部にこのパラメータを追加することはできませんか?

答えて

1

あなたのMyRestParamsを解決するためにHandlerMethodArgumentResolverのための実装を提供することができます。

public class MyRestParamsArgumentResolver implements HandlerMethodArgumentResolver { 
    @Override 
    public boolean supportsParameter(MethodParameter parameter) { 
     return parameter.getParameterType().equals(MyRestParams.class); 
    } 

    @Override 
    public Object resolveArgument(MethodParameter parameter, 
            ModelAndViewContainer mavContainer, 
            NativeWebRequest webRequest, 
            WebDataBinderFactory binderFactory) throws Exception { 
     MyRestParams restParam = new MyRestParams(); 
     restParam.setReq((HttpServletRequest) webRequest.getNativeRequest()); 

     return restParam; 
    } 
} 

次に、あなたのWebMvcConfigurerAdapterに登録:

メソッドシグネチャ春の形式を使用することとして、あなたの豆を使用します
@EnableWebMvc 
@Configuration 
public class WebConfig extends WebMvcConfigurerAdapter { 
    @Override 
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { 
     argumentResolvers.add(new MyRestParamsArgumentResolver()); 
    } 
} 
+1

これは非常にすっきりした解決策です! – membersound

+1

また、Springが依然として実装の要求パラメータをバインドしていることを確認する必要があります。さもなければ、あなたはHttpServletRequestを取得しますが、他のBeanのプロパティはまだnullのままです。 –

-1

モデル属性SpringはリクエストパラメータをWebDataBinder(ServletRequestDataBinderなど)を使用して一致する名前のBeanプロパティにバインドします。

Beanプロパティreqに一致するリクエストパラメータがないため、フィールドは決して設定されません。あなたのリクエストにreqという名前のリクエストパラメータがあったとしても、HttpServletRequestに変換することはできません。あなたはサーブレットAPIに自分自身を結びつけるためたくない場合は、実際の要求はあなたのハンドラメソッド

@RequestMapping(value = "/") 
public void getTest(@Valid MyRestParams p , HttpServletRequest request) { 
    Sysout(p.getName()); //works when invoked with /xml?name=test 
    Sysout(request); //always null 
} 

またはタイプWebRequestクラスのパラメータに型のパラメータのHttpServletRequestを追加受け取るために

+0

あなたの答えは「不可能です」と言っていますが、明らかにそうではありません:http://stackoverflow.com/a/36722594/1240557 – kryger

+0

私はそのことはできません。基本的なSpringの実装では、フィールドを設定しない理由について説明しました。あなたが簡単に行うことができるときにHttpServletRequestをPOJOに設定するだけで、なぜあなたはあなたのデザインを複雑にしなければならないのですか?提案された実装では、自分で実装する必要があるデータバインドを失うことに気付きますか?あなたがきれいで簡単なことができるときに、なぜ複雑になるのですか? –

関連する問題