Spring Boot问题汇总二

标签: Springboot 分类: Java 创建时间:2020-04-23 03:08:42 更新时间:2024-11-15 10:49:43

1.Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported

前端像后台请求数据时,出现了这个错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RequestMapping("/getloginfo")
public SysResult getDDlog(@RequestBody MultiValueMap<String,Object> jsonMap) {
try {
jsonMap.put("size","20");
Map<String, Object> map = new HashMap<>();
jsonMap.put("start_time", CronUtils.stringToData((String) jsonMap.get("start_time")).getTime());
jsonMap.put("end_time", CronUtils.stringToData((String) jsonMap.get("end_time")).getTime());

return SysResult.build(PromptMessage.SUCCESSFUL_CODE, PromptMessage.QUERY_SUCCESSFUL, jsonObject);
} catch (Exception e) {
log.error("日报查询错误",e.getMessage());
return SysResult.build(PromptMessage.FAILING_CODE, PromptMessage.QUERY_FAILING,e.getMessage());
}
}

前端的请求头格式为:application/x-www-form-urlencoded,jquery默认的Content-Type。axios默认的Content-Type是:application/json,所以可以使用@RequestBody接收

2.Required request body is missing

如果前端传入的请求头格式不正确的话,后台就拿不到正确的body里面的值。

如下示例,使用@RequestBody接收前端传入的参数时,前端代码应该如下

1
2
3
4
5
6
$.ajax({
url : url,
type : 'post',
data : JSON.stringify(json_data),
contentType : 'application/json;charset=utf-8' //中文需要加上charset=utf-8才正确
});

前端需要注意以下几点:
(1) 请求头Content-Type: application/json;charset=UTF-8

(2) data数据应该使用JSON.stringify()进行序列话

(3) 注意跨域问题,如果跨域请求,后端可能就什么也拿不到,前端也请求不到数据。(像我就出现了这么一个奇怪的问题,前端明明已经正确的配置了ajax请求,最后却什么也没有拿到)。还有一个奇怪的问题就是,明明代码就写的很对,还是出现了:provisional headers are shown问题,这个时候开启跨域请求就好了,但是再次注释掉跨域请求之后,也不会出现这个问题了,很奇怪,我只能归结为缓存的问题了。

2.If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.

启动spring boot之后,启动不了,报这个错误。

3.nested exception is java.lang.NoClassDefFoundError: com/bibichuan/phemsjava/Utils/HttpClientUtils

这个问题产生的原因就是我在网上找了一个HttpClinet的连接池的代码,然后使用这个代码进行了Http请求连接。原有的代码其实挺好的,就是我新增加了部分的转化代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static String handleEntity(HttpEntity entity, String charset)
throws IOException {
if (entity == null)
return null;

ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];

long count = entity.getContentLength();
long curCount = 0;
int len = -1;
InputStream is = entity.getContent();
while ((len = is.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
curCount += len;
}

byte[] data = outStream.toByteArray();
outStream.close();
is.close();
return new String(data, charset);
}

将EntityUtils.toString换成了handleEntity这个处理方法。问题也就从此产生了。本地开发没有任何问题,但是上传到服务器,请求这个方法,总是会报错误,找不到这个类nested exception is java.lang.NoClassDefFoundError。

1
2
// responseContent = EntityUtils.toString(entity,"GBK");
responseContent=handleEntity(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
2
3
4
@RequestMapping("/captcha")
public void captcha() throws Exception {
CaptchaUtil.out(request, response);
}

错误日志内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class sun.font.SunFontManager
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1055)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)

在我查看日志的时候,发现了:java.desktop/sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:225),于是我猜测可能是字体的问题,因为是新装的CentOS8系统,Java版本又是openjdk,于是我怀疑是字体的问题。沿着这个思路,我查找了相关的文件,刚开始找到了要安装一个ttf-dejavu的东西,这个东西在ubuntu上安装挺好的,但是在centos上安装好像不管事。

解决方法是参考文章3提出的,安装字体,然后重启电脑就可以了。

1
2
3
4
5
6
7
8
##RHEL / Centos:
sudo yum install fontconfig dejavu-sans-fonts dejavu-serif-fonts

## Ubuntu / Debian:
sudo apt install fonts-dejavu fontconfig

## SLES:
sudo zypper install dejavu-fonts fontconfig
参考文章:
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等,我就没有尝试了。

5.404错误

我用springboot生成了一个简单的应用,目录结构如下,返回了一个index视图,但是其中之后,访问:http://localhost:8080/test,显示的是:There was an unexpected error (type=Not Found, status=404),找不到文件,这个就非常的奇怪了。

多篇文章,都是说目录结构问题,我这里的Application.java,就是在controller的同级目录下的,这个显然不符合我的要求。

【解决】
主要就是没有编写配置文件,在application.properties 配置文件中,添加如下内容:

1
2
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
参考文章:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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
java.lang.NoClassDefFoundError: org/springframework/web/context/request/async/AsyncRequestTimeoutException
at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.doResolveException(DefaultHandlerExceptionResolver.java:228)
at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:141)
at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:80)
at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1300)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1111)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:830)

【解决】
这个问题,主要就是我的AzureDevops 自动部署出现了错误,所以没有更新最新的代码,也就出现了错误,更新这个控制器代码就好了。

7.hutool出现NoSuchMethodError

问题就是多次引用 hutool-core 导致的,其实我是在调用 httprequst 的时候出现的问题,后来就是把 hutool-core 和 hutool-http 这两个依赖单独引入了。

8.@Configuration无法注入@Service

我想要在一个 @Configuration 中使用 @Autowired 注入,但是总是出现 Null 的情况。

【尝试反感】
(1)使用构造函数注入
(2)增加了 @Component
(3)SpringBootApplicaton 注解增加了 scanBasePackages 配置。

【解决方案】
这个问题的解决,主要是因为我自定义实现了 BeanDefinitionRegistryPostProcessor,这个就导致了我 无法使用 @Autowired 注入 @Service。需要尝试其他的方法了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Configuration
@Slf4j
public class DroneOsdRouter implements BeanDefinitionRegistryPostProcessor {

@Autowired
private IDeviceService deviceService; // 为 null
@Autowired
private IDeviceRedisService deviceRedisService; // 为 null

@Bean
public IntegrationFlow osdRouterFlow() {

}

/**
* 因为我总是处理不了 原先注入的bean,所以就用了这种方法进行
* @param beanDefinitionRegistry
* @throws BeansException
*/
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
String beanName= "osdRouterFlow";
beanDefinitionRegistry.removeBeanDefinition(beanName);
}

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {

}
}
参考文章:
【1】.Spring Boot Configuration 无法注入 1.配置累未被扫描;2.缺少@Configuration注解;3.缺少@Component注解;4.缺少setter方法;5.配置文件中的属性错误或者缺失;6.未正确加载配置文件。
【2】.@Configuration使用@Autowired注入Bean为null解决办法
【3】.Spring 注册 Bean 在配置中的定义和使用 Autowired
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。