使用spring @RequestBody 接收参数,返回400 。 但是控台不报错误日志
使用spring @RequestBody 接收参数,返回400 , 大概率是参数问题,比如json参数转对象错误。
但是控台不打印错误日志 ,没法一眼看出问题。假如我参数很多,就麻烦了。
加断点调试:
InvocableHandlerMethod 文件
private Object[] getMethodArgumentValues(NativeWebRequest request, ModelAndViewContainer mavContainer,
Object... providedArgs) throws Exception {
MethodParameter[] parameters = getMethodParameters();
Object[] args = new Object[parameters.length];
for (int i = 0; i < parameters.length; i++) {
MethodParameter parameter = parameters[i];
parameter.initParameterNameDiscovery(this.parameterNameDiscoverer);
GenericTypeResolver.resolveParameterType(parameter, getBean().getClass());
args[i] = resolveProvidedArgument(parameter, providedArgs);
if (args[i] != null) {
continue;
}
if (this.argumentResolvers.supportsParameter(parameter)) {
try {
args[i] = this.argumentResolvers.resolveArgument(
parameter, mavContainer, request, this.dataBinderFactory);
continue;
}
catch (Exception ex) {
if (logger.isTraceEnabled()) {
logger.trace(getArgumentResolutionErrorMessage("Error resolving argument", i), ex);
}
throw ex;
}
}
调试发现代码进入红色部分 , 但是日志级别为trace , 所以没有打印。
解决方法:
1. 配置全局错误处理 , 即GloabalException 具体自行百度。
2. 调试看其中处理json转换为对象的 类为
MappingJacksonHttpMessageConverter , 方法就是
private Object readJavaType(JavaType javaType, HttpInputMessage inputMessage) { try { return this.objectMapper.readValue(inputMessage.getBody(), javaType); } catch (IOException var4) { throw new HttpMessageNotReadableException("Could not read JSON: " + var4.getMessage(), var4); } }
设置对象参数为未找到忽略即可: 在类上加注解
@JsonIgnoreProperties(ignoreUnknown = true),然后把所有参数都传值,看看哪个参数值为空,即可找到写到的参数。
3. 改响应的日志级别,红色部分的 logger 为其父类HandlerMethod , 我项目用的log4j, 配置该类日志级别为trace就可以看到错误日志了
log4j.logger.org.springframework.web.method.HandlerMethod=TRACE
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "p3" (class classA),
not marked as ignorable (6 known properties: "p1", "p2", "p3", "p4", "p5", "p6"])