当@ResponseBody为null时,覆盖默认消息



我想覆盖这个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);
}
...
}

当@Controller中的@ReponseBody为null时,此方法会处理错误。我试着让我自己的CustomBodyMethodProcessorRequestResponseBodyMethod Processor

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));
}
}

但这并不奏效。调试时,总是在RequestResponseBodyMethodProcessorreadWithMessageConverters方法中停止,而不是在CustomBodyMethod Processor的重写方法中停止

我感谢你能为我提供的任何帮助!!

感谢

找到了解决方案。

@Autowired
private RequestMappingHandlerAdapter adapter;
@PostConstruct
public void prioritizeCustomArgumentMethodHandlers () {
List<HandlerMethodArgumentResolver> argumentResolvers = new ArrayList<>(adapter.getArgumentResolvers ());
List<HandlerMethodArgumentResolver> customResolvers = adapter.getCustomArgumentResolvers();
argumentResolvers.removeAll(customResolvers);
argumentResolvers.addAll (0, customResolvers);
adapter.setArgumentResolvers (argumentResolvers);
}

我的CustomBodyMethodProcessor已添加到解析器列表中,但原始的RequestResponseBodyMethod ProcessorustomBodyMethodProcessor

解决方案是从解析器中删除我的CustomBodyMethodProcessor,给予优先级并将其再次添加到列表中!

多亏了这个asnwerhttps://stackoverflow.com/a/19847526/4267653并向@BeUndead寻求线索!

最新更新