【发布时间】:2016-04-12 09:43:37
【问题描述】:
我正在使用 Spring 的 AbstractHttpMessageConverter 来实例化我自己的对象。
转换器
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 {
}
}
在 readINternal() 中,我传递了一个 HttpInputMessage 对象,该对象只有 getBody() 函数,该函数产生 HTTPRequest 的 InputStream。
我尝试编写自己的代码来解析和构建 ParameterMap,但如果 urlencoding 不同,它并不总是有效。
我是否可以从转换器中获取 Spring 的 WebRequest 或 HttpServletRequest 对象并在那里使用美妙的 getParameterMap() 函数?
TL;DR
有没有办法在 MessageConverter 中使用 WebRequest 或 HTTPServletRequest 而不是 HttpInput,这样我就可以使用美妙的 getParameterMap() 函数,而不是重新发明轮子?
谢谢
【问题讨论】:
-
您通常可以将 HttpServletRequest 自动连接到 Spring 托管 bean(例如,只需将其添加为字段:
@Autowired HttpServletRequest request;)。请注意,Spring 框架并不打算让您访问消息转换器中的 url 参数。可能有更好的地方可以插入您的功能(转换服务?参数解析器?)
标签: spring spring-mvc converter http-request-parameters