zoukankan      html  css  js  c++  java
  • 使用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"])

      

  • 相关阅读:
    [转载]C#流,字节数组,字符串
    [C#错误]未找到类型或命名空间名称" " (是否缺少 using 指令或程序集引用?)
    批处理删除带空格的长目录或文件夹
    注释换行 引号内的字符串没有正确结束
    oracle sqlplus运行sql文件
    Target runtime Apache Tomcat v6.0 is not defined.错误解决方法
    Tomcat:Caused by: java.lang.OutOfMemoryError: PermGen space
    虚拟机vmware启动太快无法进入bios的解决方法
    MySQL Error 1130 Host 'localhost' is not allowed to connect to this MySQL server
    如何远程判断服务器的操作系统?
  • 原文地址:https://www.cnblogs.com/zhangchenglzhao/p/14446481.html
Copyright © 2011-2022 走看看