【springboot+Thymeleaf springcloud问题笔记】

  1. 真的没发现错误时,要积极地 clean Idea,3次了都是这样!!!
  2. Feign:需要多个生产者时,要指明其url,不然会报错,例如
@FeignClient(name = ServiceNameConstants.SYSTEM_SERVICE, 
		url = "http://127.0.0.1:8001",
        fallback = SysUserLoginFallback.class, 
        fallbackFactory = SysUserLoginFallbackFactory.class,
        configuration = FeignConfig.class)
  1. Feign接口的方法中,如果有多个参数,要加@RequestParam注解,如下:
@RequestMapping("/sysUser/login/doLogin")
public String login(@RequestParam("loginName") String loginName,
                    @RequestParam("password") String password,
                    @RequestParam("captcha") String captcha)
  1. 当为Get请求时,Feign消费者interface的参数一定要加上@RequestParam或@ResponseBody,否则报错,Request method ‘POST’ not supported!!!
  2. 重定向:中文做参数进行重定向时,会乱码,解决方法如下:
return "redirect:/feign/find/" + URLEncoder.encode(logiName, "UTF-8");
  1. thymeleaf添加页面隐藏值,传递数据【注意th:value,不是th:text】
<input type="hidden" id="areaUuid" name="areaUuid" th:value="${areaUuid}" />
  1. thymeleaf路径请求问题:
    1)请求参数为JSON对象,@RequestBody @RequestParam 前端jQuery代码请求
    参考大佬:
    添加链接描述
    后台接口参数被@RequestBody修饰:
@PostMapping("feign/sysUser/update")
@ResponseBody
public String updateInfo(@RequestBody SysUser sysUser)
<button class="btn btn-success btn-block" type="button" onclick="updateInfo()">
                                修改用户信息</button>
<script th:inline="javascript">
function updateInfo() {
    
    
        var formObject = {
    
    };
        var formArray = $("#sysUserInfo").serializeArray();
        $.each(formArray, function (i,item) {
    
    
            formObject[item.name] = item.value;
        });
        console.log(formObject);
        // var loginName = $('#loginName').val();
        // console.info(loginName);
        // var phonenumber = $('#phonenumber').val();
        // var email = $('#email').val();
        // var userId = $('#userId').val();
        $.ajax({
    
    
            url:"/feign/sysUser/update",
            type:"POST",
            contentType:"application/json;charset=utf-8",
            data: JSON.stringify(formObject),
            async: true,    // 这个一定要加!!!后段才会接收到数据,前端的负载也不会为空
            // data:JSON.stringify({"loginName":loginName, "phonenumber":phonenumber, "email":email, "userId":userId}),
            success:function(data) {
    
    
                if (data == 1){
    
    
                    alert("修改成功!");
                    window.parent.location.reload();
                    var index = parent.layer.getFrameIndex(window.name);
                    parent.layer.close(index);
                }else if (data == 0){
    
    
                    alert("修改失败!");
                }
            },
            error:function () {
    
    
                alert("修改失败,请重试!")
            }
        })
    }
</script>    

2)接口参数类似@RequestHeader(“current-id”) String userId,ajax传参方式为:

$.ajax({
    
     
        beforeSend: function (request) {
    
    
            request.setRequestHeader("current-id", userId);
        }
        ... ...
 })            
  1. 使标签内容不可改的方法,见大神的文章,input标签内容不可改,但可传递
  2. 使用Ajax来跳转的时候,会把返回的所有东西都用Ajax的success来处理。也会把返回的页面也当成数据来处理,如果想要跳转就必须在Ajax的success里来定义跳转的路径,这时候才是使用Ajax时真正的跳转,见大佬文章:使用Ajax实现页面跳转
  3. thymeleaf中的js,获取接口传过来的值
    非常感谢大佬的文章解决了我的问题,Thymeleaf教程 (十二) 标签内,js中使用表达式
    帮助我的地方是“给js变量赋值”,如下,非常详细:
<script th:inline="javascript">
/*<![CDATA[*/
    ...
    var username = /*[[${session.user.name}]]*/ 'Sebastian';
    ...
/*]]>*/
</script>
/*[[…]]*/表达式的理解如下:

/*…*/中的内容在用浏览器打开静态 网页时,会被忽略.
‘Sebastian’会在浏览器中显示。静态时。
Thymeleaf解析时,会解析/*[[…]]*/的内容,并把获得的值替换掉/*[[…]]*/后面的内容。

所以,解析后的结果如下:

<script th:inline="javascript">
/*<![CDATA[*/
    ...
    var username = 'John Apricot';
    ...
/*]]>*/
</script>
  1. Feign调用微服务,导出excel时,1)注意用ResponseEntity<byte[]>接收;2)注意ajax没法实现文件下载,只能读取,可以使用window.location.href,例如:
<a class="btn btn-sm btn-success" type="button" onclick="exportDevice()">导出数据</a>

function exportDevice(){
    
    
    var aUuid = $('#aUuid').val();
    console.log(aUuid);
    window.location.href="/feign/activity/exportDeviceTypeList?"+"activityUuid="+ aUuid + "&startTime="+"&endTime=";
};
  1. Feign调用微服务,生成验证码时,注意用byte[]来转换
  2. 在大多数情况下,我们都是采用 #{} 读取参数内容。但是在一些特殊的情况下,我们还是需要使用 ${} 读取参数的。比如有两张表,分别是 dept 和 dept_01。如果需要在查询语句中动态指定表名,就只能使用 ${} 。再比如:需要动态的指定查询中的排序字段,此时也只能使用 ${},简单来说,在 JDBC 不支持使用占位符的地方,都可以使用 ${}。
  3. 数据库查询字段为空,用List<Map>接收不到空值字段,call-setters-on-nulls=true 不生效问题
  4. 前端,避免页面自动刷新,可能是使用了bootstrap,其导航栏使用了表单,所以会自动刷新,因此,加上window.event.returnValue = false; 就可以解决问题了。参考大佬提交表单时页面自动刷新的相关问题及解决办法
  5. 动态创建表格 1. HTML+JS创建表格
    2.HTML页面创建动态表格JavaScript和jQuery
    3.js动态生成表格
  6. 当接口用**@RequestBody**来接收前端传递过来的json字符串时,前端ajax不可以用GET方式,要用POST方式进行提交,因为GET方式无请求体。@RequestBody接收的是请求体里的数据,所以其只能有一个。而@RequestParam接收的是key-value里面的参数,可以用于普通元素、数组、集合、对象等接收,可以有多个。见大佬文章@RequestBody与post请求的关系
  7. Feign发送get请求,传递对象参数,没有@RequestBody(因为菜单导航栏有他,所以就做成了get请求),解决:@SpringQueryMap 可以用来修饰pojo类,达到使用对象传递参数的需求。1.Feign发送get请求使用对象传参问题,@SpringQueryMap解析传参对象父类属性解决方案 2.【Java用法】Feign @QueryMap支持,@SpringQueryMap注解 feign的get传参方式
  8. 前端ajax发送JSON时注意,dataType是指后台返回的数据类型,不要轻易写json,否则会出错,即使请求成功了,也会进入到error:function(){…}。这时也可以不写。
  9. Feign传递请求头tokenFeign调用进行token鉴权
  10. thymeleaf有值为null时,会报错,解决:thymeleaf 空值的处理
    报错合集:
  11. 如果Content-Type设置为“application/x-www-form-urlencoded;charset=UTF-8”无论是POST请求还是GET请求都是可以通过这种方式成功获取参数,但是如果前端POST请求中的body是Json对象的话,会报上述错误。
  12. 报错如下:参数配置错误,原因可能是:1)插入的变量长度大于数据库字段长度;2)属性不对应;3)#{} 与 ${};4)对于时间,没插入
2022-05-26 16:17:19.432  WARN [,276205c01357ecde,ebd9c09fda26c36e,true] 9852 --- [  XNIO-5 task-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [com.uniigym.common.exception.BusinessException: 
### Error updating database.  Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')
        values (
                '7c1b0c765d804b89b5103a709b4c9151',
         ' at line 11
### The error may exist in file [D:\xxx\target\classes\mapper\database\TUniigymUserMapper.xml]
### The error may involve defaultParameterMap
### The error occurred while setting parameters
  1. 报错如下:Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type java.time.LocalDateTimefrom String "2022-05-19": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2022-05-19' could not be parsed at index 10;接口接收参数后将该字符串转为日期时,发生错误,项目中使用fastjson来处理json数据,解决:在对应的字段上加@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
  2. 解析json时报错,看评论:{}形式的数据,使用parseObject,[]形式的数据,使用parseArray添加链接描述com.alibaba.fastjson.JSONException: syntax error, expect {, actual , pos 0

猜你喜欢

转载自blog.csdn.net/weixin_45463572/article/details/124756655