Java开发中碰到的小问题

1.对象字段缺失

把对象转json进行打印时,发现字段缺失,但是数据的日志打印正常显示字段。

log.info("直接打印整个对象...[{}]", JSONObject.toJSONString(acsDevice));

数据库查出的字段包含server_Url
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
但是直接打印的对象里却没有
在这里插入图片描述
在这里插入图片描述
最后发现是mybatis的配置文件问题。mybatis默认是属性名和数据库字段名意义对应的,即数据的字段和实体类的属性都应该是server_url。但是我这里数据库字段是server_url,属性是serverUrl,采用的是驼峰命名,所以要设置属性开启驼峰命名,配置如下:

map-underscore-to-camel-case: true

2.http返回自定义的状态码

自己写的接口定义返回的状态码,如果异常或者其他问题直接返回400。

/**
 * 类描述:测试接口
 *
 * @ClassName TestController
 * @Author ward
 * @Date 2022-10-12 15:16
 */

@Controller
@RequestMapping("/test")
public class TestController {
    
    

    @RequestMapping("/error")
    @ResponseBody
    public String testError(HttpServletResponse httpServletResponse, String id) {
    
    
        String result = id + "已上线";
        httpServletResponse.setStatus(400);
        return result;
    }
}

在这里插入图片描述
在这里插入图片描述

这里可以看到可以随意自定义

3.xml文件的特殊字符

今天写了几个sql发现在数据库软件里可以用>=和<=,写在mapper里会报错,后来发现原来有特殊的转义,总结如下。

[&]——&amp;
[<]——&lt;
[>]——&gt;
["]——&quot;
[']——&apos;
原符号 转义符号
& &amp;
< &lt;
> &gt;
>= &gt;=
<= &lt;=
&apos;
" &quot;

4.springboot启动报错

在这里插入图片描述

启动有时可以有时报错,发现好像是依赖冲突,同时引入了spring-boot-starter和spring-boot-starter-web,其实这里只需要引入spring-boot-starter-web包含了spring-boot-starter。

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter</artifactId>
</dependency>

5.接口传输中文乱码

开发两个项目接口对接时,A项目的接口被B项目调用时,B项目获得到的中文数据乱码,经过排查发现跟http请求的Content-Type字段有关。
http请求过程中包含Accept请求头部(Request Header),Content-Type实体头部(Response Header),我这里采用的是hutool的http,所以在客户端增加.header(“Accept”,“text/plain;charset=UTF-8”)解决中文乱码问题,核心还是charset=UTF-8。
这里我直接打印了hutool的头部信息:

{Accept=[text/html,application/json,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8], 
User-Agent=[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) 
Chrome/75.0.3770.142 Safari/537.36 Hutool], Accept-Encoding=[gzip, deflate], 
Accept-Language=[zh-CN,zh;q=0.8]}

个人理解:Accept用于客户端,Content-Type用于服务端,中文乱码设置下字符集即可

result = HttpRequest.get(httpUrl)
                    .timeout(3000)
                    .header(Header.AUTHORIZATION, "Bearer " + token)
                    .header("Accept","text/plain;charset=UTF-8")
                    .execute()
                    .body();

6.临时路径丢失

在这里插入图片描述

扫描二维码关注公众号,回复: 15899251 查看本文章

springboot在生产环境中,文件上传如果没有配置目录就会产生临时目录,在centos7中可以通过/usr/lib/tmpfiles.d/tmp.conf这个文件来查看清除的时间,默认10d就是10天。为了解决这个问题,在application参数配置里面要指定路径。

vim /usr/lib/tmpfiles.d/tmp.conf

spring:
  profiles: produce
  servlet:
    multipart:
      max-request-size: 100MB
      max-file-size: 100MB
      location: /u01/tomcat/file/

在这里插入图片描述
在这里插入图片描述

7.request.getParameterMap返回的数据格式问题

根据java规范,这个方法返回的值是数据类型,即Map<String,String[]>,导致我们最后获取到的数据的键值对中的值会是这样,“[123]”,再提取的时候十分麻烦。所以找了个map转换类来进行转换。

    /**
     * map转换类(<String,String[]>转<String,String>)
     */
    public Map<String, String> convertMap(HttpServletRequest request) {
    
    
        Map<String, String> returnMap = new HashMap<>();
        // 转换为Entry
        Set<Map.Entry<String, String[]>> entries = request.getParameterMap().entrySet();
        // 遍历
        for (Map.Entry<String, String[]> entry : entries) {
    
    
            String key = entry.getKey();
            StringBuffer value = new StringBuffer("");
            String[] val = entry.getValue();
            if (null != val && val.length > 0) {
    
    
                for (String v:val) {
    
    
                    value.append(v);
                }
            }
            returnMap.put(key, value.toString());
        }

        return returnMap;
    }

8.jsonArray转对象

在做接口对接经常出现套娃,对象里面包含jsonArray,这里要注意细心,一一对应。自己创建的对象只能比待转化的多,不能少。发现包了两层直接diyData = diyModel.getData就不好使了,后续有空再来研究。

//byte转String
String msg = new String(message.getPayload(), StandardCharsets.UTF_8);

DiyModel diyModel = JSONObject.parseObject(msg, DiyModel.class);

猜你喜欢

转载自blog.csdn.net/weixin_43487532/article/details/127287073
今日推荐