Spring Boot问题汇总二
1.Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported
前端像后台请求数据时,出现了这个错误。
1 |
|
前端的请求头格式为:application/x-www-form-urlencoded,jquery默认的Content-Type。axios默认的Content-Type是:application/json,所以可以使用@RequestBody接收
1.SpringBoot 出现 Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported
2.Spring MVC报错”Content type ‘application/x-www-form-urlencoded’ not supported”怎么解决
3.Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported
4.@RequestBody与Content-type (这里讲了RequesBody与Content-Type的关系,同时讲了如何解决application/x-www-form-urlencoded的问题)
2.Required request body is missing
如果前端传入的请求头格式不正确的话,后台就拿不到正确的body里面的值。
如下示例,使用@RequestBody接收前端传入的参数时,前端代码应该如下
1 | $.ajax({ |
前端需要注意以下几点:
(1) 请求头Content-Type: application/json;charset=UTF-8
(2) data数据应该使用JSON.stringify()进行序列话
(3) 注意跨域问题,如果跨域请求,后端可能就什么也拿不到,前端也请求不到数据。(像我就出现了这么一个奇怪的问题,前端明明已经正确的配置了ajax请求,最后却什么也没有拿到)。还有一个奇怪的问题就是,明明代码就写的很对,还是出现了:provisional headers are shown问题,这个时候开启跨域请求就好了,但是再次注释掉跨域请求之后,也不会出现这个问题了,很奇怪,我只能归结为缓存的问题了。
1.@RequestBody对象为空,异常Required request body is missing的解决办法
2.Springboot之接收json字符串的两种方式-yellowcong
2.If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
启动spring boot之后,启动不了,报这个错误。
1.If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
2.Spring boot启动报错(If you want an embedded database , please put it on the classpath)
3.nested exception is java.lang.NoClassDefFoundError: com/bibichuan/phemsjava/Utils/HttpClientUtils
这个问题产生的原因就是我在网上找了一个HttpClinet的连接池的代码,然后使用这个代码进行了Http请求连接。原有的代码其实挺好的,就是我新增加了部分的转化代码
1 | public static String handleEntity(HttpEntity entity, String charset) |
将EntityUtils.toString换成了handleEntity这个处理方法。问题也就从此产生了。本地开发没有任何问题,但是上传到服务器,请求这个方法,总是会报错误,找不到这个类nested exception is java.lang.NoClassDefFoundError。
1 | // responseContent = EntityUtils.toString(entity,"GBK"); |
我尝试了多种方法:
(1) (无效) 注释掉额外掉代码,因为我在另外掉请求中也使用到了这个方法,所以也测试了那个方法,但是显示到是可以到。这就很奇怪了,为什么同样到代码,一个可以一个不可以呢?
(2) (无效) 经过我多次到尝试,我发现了其实可以到那个方法中并没有立即执行HttpClientUtils中到方法,而是判断了缓存,如果缓存存在,就不走Http请求了,只有缓存不存在到时候,才会去请求Http。于是我都让他们走Http,结果两个方法都会报错。
(3) (无效) 最后定位到了HttpClientUtils这个类中。经过反复到思考,我发现了本地和远程的环境的区别是在Java环境上的区别,一个是OpenJDK 13,一个是Java_1.8。于是我顺着这个思路进行了问题的排除。
(4) (无效) 结果也是不成功的,同样的代码,同样的java1.8的环境,在另一个工程中就可以完美的运行,但是等到出问题的工程,就是一个奇怪的不能再奇怪的问题了。所以,Java版本的问题,也被排除了。
最后我还是没有找到问题的原因,为了完成工作,暂时放弃了这个连接池的操作,使用了hutool.HttpUtil操作类,但是没有连接池的概念,也就是单纯的一个Http请求。
解决方法
(5) (有效) 当我再次在Utils新建了一个: com/bibichuan/phemsjava/Utils/Encrypt类的时候,上传到服务器上,同样也出现了这个问题,也就是所有新建的类都不行,这就更加的奇怪了。
最后我干脆将这个Utils文件夹的名字改为了utils小写,结果重新部署和运行,真的好了。
1.What is ClassNotFoundException in Java ClassNotFoundException is one of JavaZ
2.ClassNotFoundException (这里其实有一种情况就是大小写问题:“javac编译的时候是无视大小的,很有可能你编译出来的class文件就与想要的不一样!” 我的就是这个问题了。)
3.验证码错误
我使用了easy-captcha这个插件,禅师验证码,代码非常的简单,但是当我在一个新的系统中运行下面的代码的时候,总是出现null空指针异常,也生成不了一个验证码,我的java版本是openjdk 13 2019-09-17。
1 |
|
错误日志内容:
1 | org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class sun.font.SunFontManager |
在我查看日志的时候,发现了:java.desktop/sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:225),于是我猜测可能是字体的问题,因为是新装的CentOS8系统,Java版本又是openjdk,于是我怀疑是字体的问题。沿着这个思路,我查找了相关的文件,刚开始找到了要安装一个ttf-dejavu的东西,这个东西在ubuntu上安装挺好的,但是在centos上安装好像不管事。
解决方法是参考文章3提出的,安装字体,然后重启电脑就可以了。
1 | ##RHEL / Centos: |
1.Docker启动Java项目报异常:FontConfiguration.getVersion(FontConfiguration.java:1264) (安装一个叫ttf-dejavu的字体,这个是在Docker中部署是产生的问题)
2.Linux 下安装中文字体 (这一步我没有用到,只是在解决Geoserver现实字体的时候用到过)
3.Using Fonts with OpenJDK / Azul Zulu Builds of OpenJDK (我使用了:yum install fontconfig dejavu-sans-fonts dejavu-serif-fonts 命令安装dejavu,还是报空指针错误,当我重启电脑之后,发现这个问题解决了)
4.How To Install “ttf-dejavu” Package on Ubuntu (如何在ubuntu上安装ttf-dejavu字体,挺简单的)
5.解决Alpine缺少字体的问题 (也是在Docker环境中)
4.Unable to start embedded Tomcat server 权限不够
在Deepin中开发的时候,出现了这个问题
[原因]
主要是因为使用了80端口导致的,linux普通用户无法使用80以下的端口。
[解决]
(1) 修改启动端口
(2) 将idea以root身份启动
1 | sudo bash idea.sh |
我选择了后者,但是也有另外的方法,就是使用setid等,我就没有尝试了。
1.spring boot报错:Unable to start embedded Tomcat server 权限不够 换了80端口
2.Linux系统情况下运行项目出现Unable to start embedded Tomcat server问题参考思路如下
3.linux普通用户使用1024以下的端口
5.404错误
我用springboot生成了一个简单的应用,目录结构如下,返回了一个index视图,但是其中之后,访问:http://localhost:8080/test
,显示的是:There was an unexpected error (type=Not Found, status=404),找不到文件,这个就非常的奇怪了。
多篇文章,都是说目录结构问题,我这里的Application.java,就是在controller的同级目录下的,这个显然不符合我的要求。
【解决】
主要就是没有编写配置文件,在application.properties 配置文件中,添加如下内容:
1 | spring.thymeleaf.prefix=classpath:/templates/ |
1.使用SpringBoot中出现Whitelabel Error Page 404 错误的几种原因 1.没有启动Springboot;2.请求路径出错;3.创建controller、service、dao的目录在主程序类的目录之上,默认的扫包是只扫与主程序在同一级目录或者是主程序的下一级目录,所以目录结构不能变的。
2.springboot常见错误——Whitelabel Error Page 根据官方要求,将运行类SpringBootTestApplication放置到比其他包级别更高的位置即可
6.nested exception is java.lang.NoClassDefFoundError: org/springframework/web/context/request/async/AsyncRequestTimeoutException
在本地测试的时候,没有问题,但是部署到服务器总是出现问题,jdk 13.0.1 版本。
1 | 2022-04-16 18:21:17 3210623887 [http-nio-7007-exec-7] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler processing failed; nested exception is java.lang.NoClassDefFoundError: org/springframework/web/context/request/async/AsyncRequestTimeoutException] with root cause |
【解决】
这个问题,主要就是我的AzureDevops 自动部署出现了错误,所以没有更新最新的代码,也就出现了错误,更新这个控制器代码就好了。
7.hutool出现NoSuchMethodError
问题就是多次引用 hutool-core 导致的,其实我是在调用 httprequst 的时候出现的问题,后来就是把 hutool-core 和 hutool-http 这两个依赖单独引入了。
1.jar包存在但NoSuchMethodError 这个问题差不多。
2.cn.hutool.core.net.url.UrlBuilder.ofHttp(Ljava/lang/String;)Lcn/hutool/core/net/url/UrlBuild,问题解决方案
3.Java:使用hutool工具类UrlBuilder、urlQuery构建url查询参数
8.@Configuration无法注入@Service
我想要在一个 @Configuration 中使用 @Autowired 注入,但是总是出现 Null 的情况。
【尝试反感】
(1)使用构造函数注入
(2)增加了 @Component
(3)SpringBootApplicaton 注解增加了 scanBasePackages 配置。
【解决方案】
这个问题的解决,主要是因为我自定义实现了 BeanDefinitionRegistryPostProcessor,这个就导致了我 无法使用 @Autowired 注入 @Service。需要尝试其他的方法了。
1 |
|
【1】.Spring Boot Configuration 无法注入 1.配置累未被扫描;2.缺少@Configuration注解;3.缺少@Component注解;4.缺少setter方法;5.配置文件中的属性错误或者缺失;6.未正确加载配置文件。
【2】.@Configuration使用@Autowired注入Bean为null解决办法
【3】.Spring 注册 Bean 在配置中的定义和使用 Autowired