@toc
spring实战问题记录
JPA
新的spring中findById返回值是Optional<>类型,需要修改converter的类型和函数返回值类型。
public class IngredientByIdConverter implements Converter<String, Optional<Ingredient>> {
private IngredientRepository ingredientRepo;
@Autowired
public IngredientByIdConverter(IngredientRepository ingredientRepo) {
this.ingredientRepo = ingredientRepo;
}
@Override
public Optional<Ingredient> convert(String id) {
return ingredientRepo.findById(id);
}
}
security
照着书加入了security,但是在我访问/login有下面报错
There was an unexpected error (type=Not Found, status=404).
需要在webconfig.java
里加入路由配置,
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("home");
registry.addViewController("/abc").setViewName("home");
registry.addViewController("/login");
}
最后一行指定/login对应的路由。
加入AngularJS前端
对应书上第二部分第6章
- 原书代码使用java8,
pom.xml
里的java.version
都是1.8,需要改为本机对应的jdk,否则会有warning,我使用jdk11,改为11
{
"resource": "/home/aiqiang/Spring/ch06/tacos",
"owner": "_generated_diagnostic_collection_name_#2",
"code": "0",
"severity": 4,
"message": "The compiler compliance specified is 1.8 but a JRE 11 is used",
"source": "Java",
"startLineNumber": 1,
"startColumn": 1,
"endLineNumber": 1,
"endColumn": 1
}
- thymeleaf.extra
dependencies.dependency.version' for org.thymeleaf.extras:thymeleaf-extras-springsecurity4:jar is missing
因为我使用的springboot2.5.1,所以此处需要改变版本
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>
- tacocloud-api中的pom.xml需要加入hateoas的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
另外由于hateoas同样有变化,所以需要改变代码中的import内容,比如LinkBuilder 和 EntityLinks移动到了server包中,相关升级后的代码在tacocloud-api中,可以在我的git仓库里找到
对应替换脚本可以从官方仓库
- 我用的是springboot5,里面使用juit5,需要按照文档把作者提供的代码更新,文档,主要部分位于tacos的test文件夹下,可以参考我已经升级完的版本
- 原书给的代码将内容拆分了,直接用maven去build发现报错
java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
此处指出java11移除了JAXB的API
stackoverflow
手动加入pom.xml,
dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
</dependency>
<!-- JAXB RI, Jakarta XML Binding -->
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>3.0.2</version>
最开始我加入了3.0.0的版本,发现还是会报错,后来在maven的官方仓库里发现了新版本,换成新版本3.0.2神秘就好了,原因不明
报错如下
java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
换成3.0.2版本前,报错为
he Class-Path manifest attribute in /home/aiqiang/.m2/repository/com/sun/xml/bind/jaxb-impl/3.0.0/jaxb-impl-3.0.0.jar referenced one or more files that do not exist:
file:/home/aiqiang/.m2/repository/com/sun/xml/bind/jaxb-impl/3.0.0/jaxb-core.jar