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"])

      

  • 相关阅读:
    BZOJ 3881: [Coci2015]Divljak
    BZOJ 2434: [Noi2011]阿狸的打字机
    BZOJ 2580: [Usaco2012 Jan]Video Game
    BZOJ 3940: [Usaco2015 Feb]Censoring
    BZOJ 3942: [Usaco2015 Feb]Censoring
    PTA L2-002 链表去重 团体程序设计天梯赛-练习集
    PTA L2-001 紧急救援-最短路(Dijkstra)多条最短路找最优解并输出路径 团体程序设计天梯赛-练习集
    PTA L1-020 帅到没朋友 团体程序设计天梯赛-练习集
    Codeforces 429 B. Working out-dp( Codeforces Round #245 (Div. 1))
    HDU 6467.简单数学题-数学题 (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)
  • 原文地址:https://www.cnblogs.com/zhangchenglzhao/p/14446481.html
Copyright © 2011-2022 走看看