java web 经验笔记 (一)
文章目录- 1.`Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class有关datasource`
- 2. `Circular view path [login]: would dispatch back to the current handler URL [/login] again. Check your ViewResolver setup`
- 3. `Error running 'SecurityTest.testPw': Failed to resolve org.junit.platform:junit-platform-launcher:1.5.2`
- 4. `There was an unexpected error (type=Not Found, status=404).No message available`
- 5. `Encoded password does not look like BCrypt`
- 6. @Autowired注解时发现有错误提示:`could not autowire,no beans of "XXX" type found`,但程序的编译和运行都正常
- 7. Reader r = new FileReader("userText.txt");系统找不到指定文件
- 8. `Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start`
- 9. `A component required a bean of type 'com.service.ThirdUserService' that could not be found.`
- 10.`Resolved[org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported]`
- 11. `org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.mapper.UserMapper.login`
- 12. 方法走不到,一直405!!
因为我pom依赖文件中引入了mybatisl依赖,spring自动装配,却没有找到配置数据源,因此tomcat启动时会检查配置,找不到就报错了,tomcat启动失败
出现这个错误就是datasource数据源的问题,看看是否配置了,配置文件中的格式有没有错误(yml缩进细节注意了)
不想配置就直接在启动类注解上加东西,把它排除掉,不检测它。
如:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
此外,微服务项目中报错14.Failed to auto-configure a DataSource: 'spring.datasource.url' is not specified and no embedded datasource could be auto,也是上述原因引起
父工程依赖有jdbc的相关配置,但子工程没有,启东时找不到配置就报错。
解决方法同上!
页面404
视图解析器问题 ,引入thymeleaf模板引擎
原因:缺少测试对应的依赖
解决方法: 类文件中加上 import org.testng.annotations.Test; 后根据idea提示,加上包对应的依赖即可。
页面404!!
原因:直接访问springboot项目下的templates目录里的html文件报错,templates目录是受保护的,不能直接访问,可以由控制层转向
直白翻译:加密后的密码不像是BCrypt加密过后的
这个是因为我当时代码里登录逻辑中明文密码是用BCrypt加密的,如:
@Bean
public PasswordEncoder getPw(){
return new BCryptPasswordEncoder();
}
@Resource
private PasswordEncoder pw;
....
....
//对用户输入的密码加密。这里没从前端取用户输入的,直接写了意思一下
String password = pw.encode("123456");
对比密码时是拿着这个加密过后的password和数据库中的对比
但是由于数据库里存的密码是明文(我忘改了),就报错了。。。
解决方法:数据库改成存密文
但是要注意,这个存的密文一定是要经过BCrypt(你代码中指定的那个加密算法)加密的,不然还是会报这个错误,。
一般注册的时候会把用户密码以密文形式存储到数据库(经过加密存到数据库),但是由于我这里是直接在数据库中写入用户测试数据,所以就不知道密文了,那怎么直接测试数据库密文?
如下,写个测试类,把加密后的密文输出,再直接写到数据库中去。
@SpringBootTest
public class SecurityTest {
@Test
public void testPw(){
PasswordEncoder pw = new BCryptPasswordEncoder();
//加密(盐不一样,每次加密的密文也不一样)
String encode = pw.encode("123456");
System.out.println(encode);
//比较密码
boolean matches = pw.matches("123456", encode);
System.out.println(matches);
}
}
6. @Autowired注解时发现有错误提示:could not autowire,no beans of "XXX" type found,但程序的编译和运行都正常
用@Resource注解替换@Autowired注解(纯粹看爆红不爽)
另外,idea中用@Autowired注入field时,会有波浪线警告,
idea不推荐我们使用@Autowired注解,具体查看大佬博客 为什么idea不推荐我们使用@Autowired注解
此外,@Autowired常和@Quilefier搭档(常用来指定同一个接口下的多个实现类),但是@Quilefier(" 这里不能从配置文件中取数据") ,而用@Resource(name=" ${xx.xx}")则可以。亲测。
7. Reader r = new FileReader(“userText.txt”);系统找不到指定文件文件路径的问题。txt文件我放在了springboot项目的resources目录下,
springboot默认读取资源文件从resources下读取,只要不在默认的resources目录下,都要在pom.xml中配置,
具体配置类似:
src/main/java .xml false
放在resource下,写路径的时候可以直接 classpath:xxx.xx
看了下编译过后的class文件,里面确实有我要读取的文件,但是,运行还是报错,找不到文件。
Reader r = new FileReader(“userText.txt”)
只写了个文件名,idea中鼠标移上去还能看到文件的绝对路径,但就是运行起来找不到,
最后解决办法是,把绝对路径写上去就可以了。
Reader r = new FileReader(“D:软件IntelliJ IDEA 2020.1.2ideaProjectsmultiAuthenticationmyloginsrcmainresourcesuserText.txt”);
原因:springBoot和springcloud版本冲突
最后用的是2.3.4.Release 和 Hoxton.SR8
springboot项目启动报错!组件需要找不到“Service”类型的bean
一般是因为service的实现类serviceimpl忘记了加@Service注解(根源是:找不到接口的实现类)
我这里报错是因为,由于我是微服务间调用接口,用了@FeignClient(" name="提供端的spring.application.name")
openfeign的pom依赖引入错误,消费端接口上的@FeignClient注解就无效,导致消费端启动运行时不能动态生成接口代理实现类,启动失败!报错,找不到bean。
原因:因为我前台使用表单提交的数据,默认contentType是application/x-www-form-urlencoded;charset=UTF-8,而我的controller方法参数用了@RequestBody,表示将前台传来的json数据绑定到对象上,如果这样的话,前台提交数据时应该指定contentType是application/json,而我前端传过来的实际上是个实体对象,因此报错!
解决方法:
1. 把方法的参数接收格式修改为接收form表单。把注解@RequestBody 去掉,因为此注解表示接收的参数格式为json.(此方法不可取,原因: 我这里是微服务间接口调用,OpenFeign 在构造请求时需要@RequestMapping/@RequestParam/@PathVariable/@RequestHeader/@RequesBody等来构造http请求。不接受传一个对象)
2.(前端以ajax请求响应,返回给后端json,后端用@RequestBody绑定json数据和实体类对象的字段一一对应),后端测试时用postman测
即在mybatis中dao接口与mapper配置文件在做映射绑定的时候出现问题,简单说,就是接口与xml要么是找不到,要么是找到了却匹配不到。
原因:
我的配置文件中 mybatis配置别名type-aliases-package失效!原因是mybatis不支持使用通配符 * !!!
解决办法: 法1. 将mybatis起别名的配置取消掉,mapper.xml文件中改用完全限定类名!
法2. 逐个包路径逗号分隔.
法3. 引入mybatis-plus依赖和别名配置
微服务接口调用时,一个模块发起请求,但一直走不到另一个模块,以为是接口方法对应的请求路径、feign啥的配置错了,导致拿不到参数数据。
这时候考虑下请求是不是被拦截掉了,所以连方法都进不去。
我发起请求的模块里有登录的拦截器,但是对于另一个模块的登录请求路径我放行了啊。
测试一下直接从另一个模块发起请求,测试接口,运行报错,显示有拦截器。。。
但是我这个模块的拦截器早就删掉了,怎么会被拦掉呢?
原因是idea源码修改了,但target里编译后的文件里还存在我之前删了的拦截器。
解决方法: 右键模块名,**rebuild,**再重启就可以访问到了。



