【发布时间】:2021-08-17 02:44:44
【问题描述】:
我想从这个 Spring 类中覆盖这个行为:
public class RequestResponseBodyMethodProcessor extends AbstractMessageConverterMethodProcessor {
...
@Override
protected <T> Object readWithMessageConverters(NativeWebRequest webRequest, MethodParameter parameter,
Type paramType) throws IOException, HttpMediaTypeNotSupportedException, HttpMessageNotReadableException {
...
if (arg == null && checkRequired(parameter)) {
throw new HttpMessageNotReadableException("Required request body is missing: " +
parameter.getExecutable().toGenericString(), inputMessage);
}
...
}
当@ReponseBody 来自@Controller 时,此方法处理错误。我试图让我自己的 CustomBodyMethodProcessor 从 RequestResponseBodyMethodProcessor 扩展,如下所示:
public class CustomBodyMethodProcessor extends RequestResponseBodyMethodProcessor {
public CustomBodyMethodProcessor(List<HttpMessageConverter<?>> converters) {
super(converters);
}
@Override
protected <T> Object readWithMessageConverters(NativeWebRequest webRequest, MethodParameter parameter,
Type paramType) throws IOException, HttpMediaTypeNotSupportedException, HttpMessageNotReadableException {
HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class);
Assert.state(servletRequest != null, "No HttpServletRequest");
ServletServerHttpRequest inputMessage = new ServletServerHttpRequest(servletRequest);
Object arg = readWithMessageConverters(inputMessage, parameter, paramType);
if (arg == null && checkRequired(parameter)) {
//I want to change this....
throw new HttpMessageNotReadableException("Required request body is missing: " +
parameter.getExecutable().toGenericString(), inputMessage);
}
return arg;
}
}
所以,添加新的 CustomBodyMethodProcessor 我做了:
@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
List<HttpMessageConverter<?>> converters;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
WebMvcConfigurer.super.addArgumentResolvers(resolvers);
resolvers.add(new CustomBodyMethodProcessor(converters));
}
}
但这不起作用。当我调试时,总是在 RequestResponseBodyMethodProcessor 的 readWithMessageConverters 方法中停止,而不是在 CustomBodyMethodProcessor
的我的覆盖方法中停止感谢您为我提供的任何帮助!
谢谢
【问题讨论】:
-
如果您在列表的前面添加您的 (
resolvers.add(new …, 0);) 会发生什么?或者在添加你的之前删除另一个 (resolvers.removeIf(i -> i instanceof RequestResponseBodyMethodProcessor);)? -
嗨!
resolvers为空,内部没有RequestResponseBodyMethodProcessor的实例。添加我的索引为 0 并且没有结果...谢谢! -
你的回答@BeUndead 带我走上正确的道路...stackoverflow.com/a/19847526/4267653
标签: java spring-boot spring-mvc