SpringBoot问题系列(二)

1 加载配置文件失败

  • 问题
    ‘url’ attribute is not specified and no embedded datasource could be configured
  • 原因
    springboot启动是为找到配置文件:application.yml
  • 解决
    pom.xml文件中添加:
<build>
  <resources>
    <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>**/*.*</include>
        </includes>
    </resource>
  </resources>
<build>

2 数据源加载失败

2.1 配置tomcat加载失败

  • 问题
    2019-12-30 13:21:43 [INFO] - {dataSource-1} closed
  • 原因
    配置ssl证书时添加了type-alias: tomcat
  • 解决
    删除key-alias: tomcat,启动文件配置tomcat
package com.sb;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.context.annotation.Bean;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SpringBootApplication 
@MapperScan("com.sb.mapper")
@EnableSwagger2
@EnableCaching 
public class SSLTest extends SpringBootServletInitializer{
    private static Logger logger = LoggerFactory.getLogger(SSLTest.class);
    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application){
        return application.sources(XStartVideoAnalysis.class);
    }
    @Bean
    public TomcatServletWebServerFactory servletContainer(){
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory(){
            @Override
            protected void postProcessContext(Context context){
            	// 强制使用https
                // SecurityConstraint constraint = new SecurityConstraint();
                // constraint.setUserConstraint("CONFIDENTIAL");
                // SecurityCollection collection = new SecurityCollection();
                // collection.addPattern("/*");
                // constraint.addCollection(collection);
                // context.addConstraint(constraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(httpConnector());
        return tomcat;
    }
    @Bean 
    public Connector httpConnector(){
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);
        connector.setRedirectPort(443);
        return connector;
    }

    public static void main(String[] args){
        SpringApplication.run(SSLTest.class, args);
        logger.debug("测试日志级别DEBUG");
        logger.warn("测试日志级别WARN");
        logger.info("任务已启动");
    }
}

2.2 开发环境没有证书

  • 原因
    开发环境没有证书,配置了Tomcat Bean
  • 方案
    取消TomcatBean配置,将2.1中的@Bean注释即可。

3 内置Tomcat配置

配置文件:application.yml

server:
	port: 8080
	maxHttpHeaderSize: 8192

4 Springboot访问异常

  • 异常信息
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:428)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:684)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:800)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1471)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)
  • 原因
    https端口使用http访问。
  • 解决
    https和http访问各自端口。

5 缓存

5.1 @CacheConfig

  • 异常信息
    No cache could be resolved for ‘Builder[public java.lang.String com.company.web.service.impl.GetTokenServiceImpl.getTokenFromCache()] caches=[] | key=’#token’ | keyGenerator=’’ | cacheManager=’’ | cacheResolver=’’ | condition=’’ | unless=’’ | sync=‘false’’ using resolver ‘org.springframework.cache.interceptor.SimpleCacheResolver@281d7903’. At least one cache should be provided per cache operation."
  • 原因
    未配置@CacheConfig。
  • 解决
    配置@CacheConfig。

5.2 返回值缺少key

  • 异常信息
    Null key returned for cache operation (maybe you are using named params on classes without debug info?) Builder[public java.lang.String com.company.web.service.impl.GetTokenServiceImpl.getTokenFromCache()] caches=[token] | key=’#token’ | keyGenerator=’’ | cacheManager=’’ | cacheResolver=’’ | condition=’’ | unless=’’ | sync=‘false’
  • 原因
    执行函数没有使用key同名的参数
  • 解决
    执行函数使用与key同名的参数,如,key获取name,执行函数使用参数name。
@Cacheable(key = "#name")
    @Override
    public String getTokenFromCache(String name) {
        Map returnMap = new HashMap();
        GetToken getToken = new GetToken();
        String token = getToken.tokenStr();
        returnMap.put("token", token);
        return token;
    }

5.3 无法存储到Redis

  • 异常
    Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.
  • 原因
    Redis关闭写入权限。
  • 解决
    关闭redis-server,重启redis-server
ps aux | grep redis
kill -9 pid-num
# Mac环境添加配置文件
redis-server redis.conf
# Linux发行版
redis-server

6 数据转换失败

java.lang.String cannot be cast to com.alibaba.fastjson.JSONObject

7 POI获取数据行数

场景:Excel文档,共有5行数据,手动删除两行,还剩三行数据,POI工具获取Excel文件行数,是5行,不是3行。
原因:POI通过HSSFWorkbook类方法getSheetAt(row)获取文件sheet,进一步使用getLastRowNum()获取“有效”数据行数,共有两种情况:
1.获取未经过删减的Excel文件行数;
2.获取经过删减的Excel文件行数;
若获取经过删减的Excel文件行数,读取的行数为未删减之前的原始文件行数。
解决:
通过getRow(row)获取数据,判断该行数据是否为全空,若为全空,则结束读取,否则继续读取。

8 启动springboot失败

  • 异常
    2020-05-13 15:28:53 [INFO] - Stopping service [Tomcat]
    2020-05-13 15:28:53 [INFO] -

Error starting ApplicationContext. To display the conditions report re-run your application with ‘debug’ enabled.

  • 原因
    mapper文件内容(*.xml)格式有错误。
  • 方案
    检查mapper文件内容,本次异常因为namaspace与mapper文件文件名不对应。

9 时间解析失败

  • 问题
    JSON parse error: Cannot deserialize value of type java.time.LocalDateTime from String “2020-06-03”: Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text ‘2020-06-03’ could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {},ISO resolved to 2020-06-03 of type java.time.format.Parsed; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type java.time.LocalDateTime from String “2020-06-03”: Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text ‘2020-06-03’ could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {},ISO resolved to 2020-06-03 of type java.time.format.Parsed\n at [Source: (PushbackInputStream); line: 3, column: 20] (through reference chain: com.company.workordersystem.po.SubmitWorkorderToXStartPO[“filterStarttime”])
  • 原因
    LocalDateTime只能解析yyyy-MM-dd HH:mm:ss格式的时间,无法接收yyyy-MM-dd格式的数据.

10 获取json数据失败

  • 异常
    {
    “timestamp”: “2020-06-18T03:57:12.698+0000”,
    “status”: 500,
    “error”: “Internal Server Error”,
    “message”: “Error resolving template “api/workorder/userinfos”, template might not exist or might not be accessible by any of the configured Template Resolvers”,
    “path”: “/api/workorder/userinfos”
    }
  • 原因
    未使用RestController或未添加ResponseBody.
  • 方案
    使用RestController或添加ResponseBody.

【参考文献】
[1]https://www.jianshu.com/p/4ce077b15a2c
[2]https://www.cnblogs.com/xiaojf/p/11626500.html
[3]https://www.cnblogs.com/senlinyang/p/10430184.html
[4]https://stackoverflow.com/questions/42218237/java-lang-illegalargumentexception-invalid-character-found-in-method-name-http
[5]https://blog.csdn.net/qq_26899063/article/details/80611173
[6]https://blog.csdn.net/xiaozaq/article/details/54097720
[7]https://blog.csdn.net/zhanglf02/article/details/80436115
[8]http://www.cocoachina.com/articles/42418

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: "Cannot be resolved to a type"这个错误通常出现在Java代码中,表示编译器无法找到定义的某个变量、常量、类、方法等。 解决这个问题需要检查代码中是否存在以下原因: 1. 没有正确import相关的类或库,导致编译器无法找到对应的类型。 2. 命名错误,变量名、类名等不符合Java命名规范。 3. 代码中使用了空指针,导致编译器无法正确解析。 解决这个问题可以采取以下措施: 1. 检查代码中import的类或库是否正确,如果有误需要及时修正。 2. 检查变量、类、方法等命名是否正确,并且符合Java命名规范。可以参考编码规范等相关资料。 3. 检查代码中的空指针错误,并及时修正。 4. 如果以上方法无法解决问题,可以尝试重启编译器或IDE,或者更新相关库文件。 总之,遇到"Cannot be resolved to a type"这个错误需要细心检查代码中的每一个细节,从而找到问题所在,及时修正错误,保证代码正常编译运行。 ### 回答2: 在Java编程中,一些常见的错误类型之一是“cannot be resolved to a type”。当编译器无法识别代码中的变量、类或方法时,就会出现此错误。因此,我们需要采取行动解决这个问题,以便程序能够成功编译和运行。 以下是一些常见方法,可用于解决“cannot be resolved to a type”错误: 1. 检查拼写错误。 在Java编程中,变量、方法和类名的正确拼写至关重要。如果名称拼写错误,则编译器会认为它是一个未定义的变量或方法。 确保要使用的名称正确拼写。 2. 引用正确的包和类。 如果要使用的类或方法不存在于当前作用域中,则编译器会发出“cannot be resolved to a type”的错误。确保在代码中正确引用所有必需的包和类。 3. 在代码开头导入所有必需的包。 可以使用import关键字将代码中需要的所有包导入。如果需要使用多个包,则应一次导入所有包。例如,import java.util.*;这样就可以使用java.util包下的所有类。 4. 检查文件路径。 如果编译器找不到文件,则也会发出“cannot be resolved to a type”的错误。确保文件的路径正确,以便编译器可以访问所需的文件。 5. 检查文件名。 与拼写类和方法名称类似,文件的名称也必须正确。如果文件名错误,则在编译时会出现错误。 总之,出现“cannot be resolved to a type”的错误可能是因为代码中存在错误,或者文件路径和名称不正确,或者是由于包引用错误等因素。通过仔细检查代码并遵循上述步骤,应该能够解决这个问题,使程序能够成功编译和运行。 ### 回答3: 在Java中,当出现“cannot be resolved to a type”这个错误时,通常是由于以下几种情况造成的: 1. 没有正确地导入相关类或包 解决方法:在类的开头添加正确的import语句,或者使用快捷键导入(Eclipse为Ctrl+Shift+O)。 2. 类或接口名称拼写错误 解决方法:核对拼写,并修改错误的拼写。 3. 当前项目中缺少相关的Jar包 解决方法:在项目属性中添加缺少的Jar包,或者将缺少的Jar包导入项目中。 4. 类或接口所在的包名称错误 解决方法:核对类或接口所在的包的名称,并将类或接口移动到正确的包中。 5. 编译顺序错误 解决方法:确保需要的文件在编译时已经被正确处理,或者通过手动编译来解决。 需要注意的是,由于该错误可能由多种原因造成,必须仔细检查代码中的所有问题,并尝试解决它们。一旦问题解决,就需要重新编译代码,确保应用程序能够正确地运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天然玩家

坚持才能做到极致

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值