日常报错 相关博客-Java技术分享站

    日常报错 code-error jvm123.com 是一个java技术分享站,内容涉及java、jvm、程序开发,单元测试框架Spock教程,测试视频教程,spring框架教程等, 以及服务器搭建、linux、docker等相关技术。

Docker中的mysql乱码问题解决

<!-- wp:paragraph --> <p>在使用docker的mysql时,存入的中文字符全部变成了问号,这是由于mysql服务的默认编码并不支持中文的汉字。可以在以下过程中设置mysql的编码方式:</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>windows 上 mysql 编码</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>windows上,在安装mysql时,有选择编码方式的步骤,可以直接选utf-8。如果在安装的时候没有注意这个选项,可以找到mysql的配置文件(mysql.ini或者my.ini),修改其中的的如下几句重启服务即可:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>[mysqld] character-set-server=utf8 collation-server=utf8_general_ci [client] default-character-set=utf8 [mysql] default-character-set=utf8</code></pre> <!-- /wp:code --> <!-- wp:heading --> <h2>linux和docker 上 mysql 乱码</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>linux或者docker上,找到 mysql.ini或者my.ini 修改,然后重启服务肯定可以解决问题,但是,在docker中,官方镜像说明已经提供了配置编码的方法。旨在不修改原有的配置文件,如下:</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":3} --> <h3>docker容器挂载自定义的配置文件</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>使用如下的命令启动容器,并挂载配置文件:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>$ docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>在自己的文件夹中自定义一个 mysql.cnf ,如上文所说,配置编码即可,这个配置会优先于my.ini中的配置。</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":3} --> <h3>docker容器的启动参数中设置</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>使用如下命令启动容器即可设置编码参数:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci</code></pre> <!-- /wp:code --> <!-- wp:heading {"level":3} --> <h3>覆盖docker容器中的配置文件设置编码</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>就是自己新建mysql.cnf文件,并写好编码的配置,将它复制到容器内部,使用如下命令:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>docker cp mysql.cnf docker-mysql:/etc/mysql/conf.d/</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>重启即可。</p> <!-- /wp:paragraph -->

分类:docker日常报错数据库服务器搭建linux
标签:mysqldocker容器character-set-serverlinux中文乱码dockercentosmysql乱码

2019-10-07 19:51:35.0
Docker中的mysql乱码问题解决  docker-zhong-de

Springboot项目中文乱码解决(源码案例)

<!-- wp:heading --> <h2>Springboot项目中中文乱码案例</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>使用idea搭建了一个springboot项目,版本号为1.5.22.ELEASE,只选择了spring-boot-starter-web依赖,自己编写controller之后,返回中文却乱码了,controller源码如下:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>@RestController class TestController { @GetMapping("test") String test() { "测试乱码111111abc" } }</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>测试后返回结果如下:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":1372} --> <figure class="wp-block-image"><img src="http://jvm123.com/wp-content/uploads/2019/10/springboot乱码.jpg" alt="" class="wp-image-1372"/><figcaption>springboot项目中文乱码</figcaption></figure> <!-- /wp:image --> <!-- wp:paragraph --> <p>原因很明显,可以从上图中看出来:http响应的编码格式不对,设置为utf-8即可。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>在网上找到的方式,大都是设置以下两个配置,然而并没有用:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>spring: http: encoding: charset: utf-8 force: true</code></pre> <!-- /wp:code --> <!-- wp:image {"id":1373} --> <figure class="wp-block-image"><img src="http://jvm123.com/wp-content/uploads/2019/10/springboot乱码2.jpg" alt="" class="wp-image-1373"/></figure> <!-- /wp:image --> <!-- wp:heading --> <h2>乱码原因分析解决</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>http响应头中的编码为 charset=ISO-8859-1,我们需要改变为UTF-8,所以我们可以通过在controller中设置响应编码的方式解决,controller源码可改为如下:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>@RestController @RequestMapping(produces = "application/json;charset=UTF-8") class TestController { @GetMapping("test") String test() { "测试乱码111111abc" } }</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>最终解决了乱码问题,请求响应如下图:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":1374} --> <figure class="wp-block-image"><img src="http://jvm123.com/wp-content/uploads/2019/10/springboot中文乱码.jpg" alt="" class="wp-image-1374"/></figure> <!-- /wp:image --> <!-- wp:paragraph --> <p>返回的charset也变成了UTF-8。不过这只是解决了这一个请求的乱码问题。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>Springboot项目乱码统一解决办法</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>此外,如果已经有较多的controller,这样设置很不方便。还可以通过添加一个StringHttpMessageConverter的方式,统一设置,源码如下:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>package com.jvm123.api.config /** * * @author yawn &lt; http://jvm123.com > * */ @Configuration @EnableWebMvc class MvcConfig extends WebMvcConfigurerAdapter { @Override void configureMessageConverters(List&lt;HttpMessageConverter&lt;?>> converters) { converters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8)) super.configureMessageConverters(converters) } } </code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>设置后的请求结果如下:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":1375} --> <figure class="wp-block-image"><img src="http://jvm123.com/wp-content/uploads/2019/10/springboot中文乱码4.jpg" alt="" class="wp-image-1375"/></figure> <!-- /wp:image --> <!-- wp:paragraph --> <p>这样就统一解决了springboot项目中的中文乱码问题。</p> <!-- /wp:paragraph -->

分类:spring开发笔记日常报错groovyspringbootjavajava源码springcloud
标签:springboothttp请求编码springspringboot案例groovy中文乱码springboot案例源码

2019-10-06 14:51:26.0
Springboot项目中文乱码解决(源码案例)  springboot-xiang-mu

Tomcat报错Invalid character found in method name. HTTP method names must be tokens 的处理

<!-- wp:paragraph --> <p>项目在启动后,无缘无故报错,大意就是说tomcat接收到了不合法的字符,在解析http请求的方法时出错了,完整报错如下:</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">o.apache.coyote.http11.Http11Processor : Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level. java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:430) ~[tomcat-embed-core-8.5.43.jar:8.5.43] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:684) ~[tomcat-embed-core-8.5.43.jar:8.5.43] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.43.jar:8.5.43] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808) [tomcat-embed-core-8.5.43.jar:8.5.43] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498) [tomcat-embed-core-8.5.43.jar:8.5.43] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.43.jar:8.5.43] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_102] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_102] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.43.jar:8.5.43] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_102]</pre> <!-- /wp:preformatted --> <!-- wp:heading --> <h2>处理方法:</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p><strong>换端口</strong>,目前已知普通用户使用8888端口会报错,可能与常用的内网,或者某些常用软件通信有关。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>原因分析:</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>既然是tomcat收到不合法的字符,所以我写了一个简单的 nio socket 服务器,想看看究竟收到了什么,nio socket 服务器代码如下,如果使用 ServerSocket 则接收不到,所以这个报错应该是出现在支持nio的tomcat服务器上。</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.nio.charset.Charset; import java.util.Iterator; import java.util.Set; public class NioServer { public static void main(String[] args) throws IOException { ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.bind(new InetSocketAddress(8888)); serverSocketChannel.configureBlocking(false); Selector selector = Selector.open(); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); while (true) { // 注册完之后Selector就可以通过select方法来等等请求, // select方法有一个long类型的参数,代表最长等待时间, // 如果在这段时间里接收到了相应操作的请求则返回可以处理 // 的请求的数量,否则在超时后返回0 // // eg: 如果没接收到请求,10000毫秒后回返回0 // int num = selector.select(10000L); int num = selector.select(); // 没有超时时间 // System.out.println("selector获取到" + num + "个channel"); if (num == 0) continue; Set&lt;SelectionKey> selectionKeys = selector.selectedKeys(); Iterator&lt;SelectionKey> iterator = selectionKeys.iterator(); while (iterator.hasNext()) { SelectionKey selectionKey = iterator.next(); iterator.remove(); boolean connectable = selectionKey.isConnectable(); boolean valid = selectionKey.isValid(); boolean acceptable = selectionKey.isAcceptable(); boolean readable = selectionKey.isReadable(); boolean writable = selectionKey.isWritable(); // System.out.println(connectable ? "connectable" : ""); // System.out.println(valid ? "valid" : ""); // System.out.println(acceptable ? "acceptable" : ""); // System.out.println(readable ? "readable" : ""); // System.out.println(writable ? "writable" : ""); if (acceptable) { System.out.println("连接成功!"); SocketChannel socketChannel = serverSocketChannel.accept(); socketChannel.configureBlocking(false); ByteBuffer byteBuffer = Charset.forName("UTF-8").encode("你已经成功连接服务器!"); socketChannel.write(byteBuffer); socketChannel.register(selector, SelectionKey.OP_READ); } if (readable) { SocketChannel socketChannel = (SocketChannel) selectionKey.channel(); socketChannel.configureBlocking(false); try { ByteBuffer buffer = ByteBuffer.allocate(1024); // 写入buffer socketChannel.read(buffer); // 从buffer读取并转换为char buffer.flip(); System.out.println(Charset.defaultCharset().decode(buffer)); } catch (Exception e) { } socketChannel.register(selector, SelectionKey.OP_WRITE); } if (writable) { SocketChannel socketChannel = (SocketChannel) selectionKey.channel(); socketChannel.configureBlocking(false); try { socketChannel.write(Charset.defaultCharset().encode("server已经收到你的信息。")); System.out.println("server write"); } catch (Exception e) { } socketChannel.register(selector, SelectionKey.OP_READ); } } } } }</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>启动之后,每隔几秒就会收到如下字符:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":1353} --> <figure class="wp-block-image"><img src="http://jvm123.com/wp-content/uploads/2019/10/tomcat-error.jpg" alt="" class="wp-image-1353"/></figure> <!-- /wp:image --> <!-- wp:paragraph --> <p>这很明显不是http请求的格式,tomcat解析当然会出错。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>然后我在浏览器请求了localhost:8888/test123,则会打印处http请求的内容,如下:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":1354} --> <figure class="wp-block-image"><img src="http://jvm123.com/wp-content/uploads/2019/10/tomcat-error2-1024x441.jpg" alt="" class="wp-image-1354"/></figure> <!-- /wp:image --> <!-- wp:heading --> <h2>验证:</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>之后,我将 nio server 的端口修改为8000,重启后,等待一段时间,并未收到任何信息。由此说明,在网络中,有设备在向我电脑的8888端口发送信息,而且这些信息比较短,则很可能是检测心跳的信息。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>而我把项目的端口换为8000之后,也不会出现这个错误了。</p> <!-- /wp:paragraph -->

分类:java开发笔记服务器搭建日常报错
标签:tomcatnio socketniotomcat原理http请求

2019-10-04 17:30:12.0
Tomcat报错Invalid character found in method name. HTTP method names must be tokens 的处理  invalid-character-found

excel-converter-starter导出excel文件时,数据列的顺序问题

<!-- wp:heading --> <h2>问题描述:</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>在使用 excel-converter-starter 时,注入ExExporter或者ExcelExporter导出数据时,有时导出的excel中,数据列的顺序不是按照配置文件中的顺序。例如有以下配置:</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">excel: converter: props-map: default: sheet-index: 1 name-row-index: 0 comment-row-index: 1 first-data-row-index: 2 last-data-row-index: -1 data-row-num: -1 start-column-index: 0 <strong> name-header-map: id: ID name: 名称 address: 地址 date: 日期</strong> show-name-row: true</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>数据列分别为id,name,address,date,但是最终导出excel中的列的顺序乱了。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>分析:</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>由于 <strong>name-header-map</strong> 是LinkedHashMap类型的,以保证最终导出是有序的,所以在推测应该是在读取配置文件时就已经乱序了。 </p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>再测试几次发现:使用application.properties配置文件就会使 nameHeaderMap 乱序,所以,应该是 spring boot 读取 .properties 和 .yml 配置文件的方式不同,导致读取进来的 LinkedHashMap 的顺序错乱。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>解决方法:</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>1 采用 application.yml配置文件即可</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>2 如果项目原本就采用application.properties配置文件,可以新建一个application-excel.yml 文件,再在 application.properties配置文件 中导入即可,导入 application-excel.yml 配置文件只需要加入以下配置:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>spring.profiles.include=excel</code></pre> <!-- /wp:code -->

分类:spring开发笔记日常报错源码项目分享springbootjavaexcelspringcloud
标签:excelspringapplication.propertiesspringbootexcel converter日常报错java导出SpringCloud

2019-09-27 23:17:39.0
excel-converter-starter导出excel文件时,数据列的顺序问题  excel-converter-2

SpringCloud环境下Springboot 上传文件名中文乱码

<!-- wp:heading --> <h2>文件名乱码问题</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>SpringCloud环境下Springboot 上传文件时, 中文文件名会出现乱码,文件名变成问号。但是,如果不通过网关zuul,上传文件就不会乱码。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>如下:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":1080} --> <figure class="wp-block-image"><img src="http://jvm123.com/wp-content/uploads/2019/09/upload-luanma-1024x182.jpg" alt="" class="wp-image-1080"/></figure> <!-- /wp:image --> <!-- wp:heading --> <h2>使用zuul过滤器解决</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>解决这个问题,zuul文档中推荐使用zuul的文件处理过滤器。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>而对于我们开发者来说,只需要在调用上传的接口时,url前面额外添加一个/zuul就可以应用这些过滤器了。如下代码:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code> var uploaderOptions = { queueLimit: 1, autoUpload: true, url: '/zuul/cqwf-store/import/upload', accepts: ['pdf', 'zip'], wrongFormatInfo: '文件格式不正确!' }; self.uploader = createUploader(uploaderOptions);</code></pre> <!-- /wp:code -->

分类:javaspringbootspringspringcloudJVM开发笔记日常报错
标签:spring中文乱码日常报错文件上传zuulspringbootSpringCloudzuul过滤器

2019-09-18 11:30:28.0
SpringCloud环境下Springboot 上传文件名中文乱码  springcloud-huan

Springboot 上传文件系统找不到指定的路径

<!-- wp:heading --> <h2>上传报错信息</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>Springboot 上传文件报错,在使用 MultipartFile 的 transferTo 方法时报错,代码如下:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code> public String tmpMdbFile(MultipartFile file) { File dest = new File(TMP_DIR + System.currentTimeMillis() + "_" + file.getOriginalFilename()); try { file.transferTo(dest); } catch (IOException e) { e.printStackTrace(); } return dest.getAbsolutePath(); }</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>报错信息如下:</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>java.io.IOException: java.io.FileNotFoundException: C:\Users\yawn\AppData\Local\Temp\tomcat.5222418755956874474.8095\work\Tomcat\localhost\ROOT\tmp\xxx (No such file or directory) 或</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>java.io.IOException: java.io.FileNotFoundException: C:\Users\yawn\AppData\Local\Temp\tomcat.5222418755956874474.8095\work\Tomcat\localhost\ROOT\tmp\xxx (系统找不到指定的路径。) </p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>解决方法</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>原因是我们使用了相对路径,MultipartFile 在使用transferTo的路径就会出现问题。解决办法如下:</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>1 解决这个问题可以使用绝对路径。即代码中的常量 TMP_DIR 设置为绝对路经。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>2 或者不使用transferTo方法,而从multipartFile的输入流读取文件内容。代码如下:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code> public String tmpMdbFile(InputStream is, String fileName) { File dest = new File(TMP_DIR + System.currentTimeMillis() + "_" + fileName); saveFile(is, dest); return dest.getAbsolutePath(); } private void saveFile(InputStream is, File dest) { try(FileOutputStream fos = new FileOutputStream(dest)) { int len; byte[] buffer = new byte[1024]; while ((len = is.read(buffer)) != -1) { fos.write(buffer, 0, len); } } catch (IOException e) { e.printStackTrace(); } }</code></pre> <!-- /wp:code -->

分类:javaspringbootspring日常报错服务器搭建开发笔记
标签:spring日常报错文件上传springbootMultipartFile

2019-09-18 11:05:34.0
Springboot 上传文件系统找不到指定的路径  springboot-shang