2016-04-12 18 views
0

私は自分のオブジェクトをインスタンス化できるようにSpringのAbstractHttpMessageConverterを使用しています。 readINternalでSpring HTTPMessageConverterでHTTPリクエストパラメータを取得

コンバータ

public class PaypalIPNHttpMessageConverter extends AbstractHttpMessageConverter<IPNMessage> { 

    public PaypalIPNHttpMessageConverter() { 
     super(MediaType.APPLICATION_FORM_URLENCODED, MediaType.TEXT_PLAIN); 
    } 

    @Override 
    protected boolean supports(Class<?> clazz) { 
     return clazz == IPNMessage.class; 
    } 

    @Override 
    protected IPNMessage readInternal(Class<? extends IPNMessage> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { 
     //Converts HTTPRequest into map<string,string> that IPNMessage can then parse 
     String requestString = IOUtils.toString(inputMessage.getBody(), "UTF-8"); 
     Map<String, String[]> requestMap = new LinkedHashMap<>(); 
     for (String keyValue : requestString.split("&")) { //each key value is delimited by & 
      String[] pairs = keyValue.split("=", 2); // = pairs a key to a value 
      requestMap.put(pairs[0], pairs[1].split(",")); // , splits multiple values for that key 
     } 
     return new IPNMessage(requestMap); 
    } 

    @Override 
    protected void writeInternal(IPNMessage ipnMessage, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { 

    } 
} 

()、Iだけは、HTTPRequestの入力ストリームを生成getBody()機能を有するHttpInputMessageオブジェクトを通過しています。

私は独自のコードを解析してParameterMapを構築しようとしましたが、urlencodingが異なる場合は必ずしも機能しません。

は、とにかく、私は、コンバータからSpringのWebRequestクラスまたはのHttpServletRequestオブジェクトを取得し、そこに素晴らしいgetParameterMap()関数を使用することができますありますか?

TL; DR

はMessageConverterに代わりのHttpInput WebRequestクラスまたはてHTTPServletRequestを使用するためにとにかくがありますので、私が代わりに車輪の再発明の、素晴らしいgetParameterMap()関数を使用することができますか?

おかげ

+0

を使用しています。 Springフレームワークは、メッセージコンバータのurlパラメータにアクセスするつもりはないことに注意してください。あなたの機能をプラグインする場所があるかもしれません(変換サービス?引数リゾルバ?) –

答えて

2

は、それが春FormHttpMessageConverterに実装されているかを見てください。ソリューションのように、&を使用してリクエストパラメータをトークン化します。ただし、提供されている場合は、Content-Typeリクエストヘッダーから使用するようにcharsetを使いこなします。そうでなければ、あなたは通常、ちょうどautowire HttpServletRequestの管理対象Beanを(:; `` @Autowired HttpServletRequestのリクエスト例えば単なるフィールドとして追加)春にすることができ、デフォルトのUTF-8

//extract from FormHttpMessageConverter 
public MultiValueMap<String, String> read(Class<? extends MultiValueMap<String, ?>> clazz, 
      HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { 

     MediaType contentType = inputMessage.getHeaders().getContentType(); 
     Charset charset = (contentType.getCharSet() != null ? contentType.getCharSet() : this.charset); 
     String body = StreamUtils.copyToString(inputMessage.getBody(), charset); 

     String[] pairs = StringUtils.tokenizeToStringArray(body, "&"); 
     MultiValueMap<String, String> result = new LinkedMultiValueMap<String, String>(pairs.length); 
     for (String pair : pairs) { 
      int idx = pair.indexOf('='); 
      if (idx == -1) { 
       result.add(URLDecoder.decode(pair, charset.name()), null); 
      } 
      else { 
       String name = URLDecoder.decode(pair.substring(0, idx), charset.name()); 
       String value = URLDecoder.decode(pair.substring(idx + 1), charset.name()); 
       result.add(name, value); 
      } 
     } 
     return result; 
    } 
関連する問題