【发布时间】:2021-06-24 21:27:46
【问题描述】:
我有一个 Spring Boot SOAP 服务,它使用带有 @Service 的 cxf 调用具有 JdbcTemplate 的 @Repository。一切都是自动接线的。我创建了一个模型 POJO 类 (PersonUdland),它代表数据库中的表,它只包含 getter 和 setter。
我的问题是我收到了The import dk.dxc.soapdemo.models.PersonUdland cannot be resolved to a type。它在存储库和服务中使用,并且在任何一个类中都无法识别。我使用 VS Code,当我保存文件或使用 maven 包装器执行 clean 和 package 时,会显示错误。如果我在服务或存储库文件(出现错误的位置)中进行更改并执行ctrl+z,错误就会消失。另一个ctrl+s,错误又回来了。我试图清理 Java 语言服务器工作区。没发生什么事。然后我认为可能是VS Code有错误,所以我尝试使用Eclipse。同样的错误,但是当我使用 Eclipse 的 maven(不是 maven 包装器)运行 clean install 时,没有显示错误。在 Eclipse 和 VS Code 中都没有。当我运行生成的空contextLoads()-test 时,我在PersonUdland 模型类上得到NoClassDefFoundError 和ClassNotFoundException。
当我构建应用程序并在本地运行它时,没有问题。构建和部署(使用 Ansible)Jenkins 服务器也是如此。
我不知道要查找什么,并且错误在 IDE 中显示为语法错误,因此 Spring 注释不应该做任何事情(尽管我已经尝试将 @Component 添加到模型类中)并且 @ComponentScan 应该不被使用,因为它会扫描带注释的类,并且所有文件夹都在根 java 文件夹下。
我的项目结构如下:
project
│ pom.xml
│
└───dk.dxc.soapdemo
│ │ SoapDemoApplication.java
│ │ ServletInitializer.java
│ │
│ └───service
│ │ │ PersonUdlandServiceEndpoint.java
│ │
│ └───models
│ │ PersonUdland.java
│ │
│ └───repositories
│ │ PersonUdlandRepository.java
│ │
│ └───config
│ │ ApplicationConfig.java
服务:
package dk.dxc.soapdemo.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
// "Cannot be resolved" error
import dk.dxc.soapdemo.models.PersonUdland;
import dk.dxc.soapdemo.repositories.PersonUdlandRepository;
import dk.skat.begrebsmodel._2016._01._01.*; // <-- generated from wsdl
@Service
public class PersonUdlandServiceEndpoint implements
PersonUdlandSkattefritagelseSendServicePortType {
@Autowired
private PersonUdlandRepository personUdlandRepository;
@Override
public PersonUdlandSendOType getPersonUdlandSend(PersonUdlandSendIType request) {
// "Cannot be resolved" error
PersonUdland personUdland = personUdlandRepository.getPersonUdlandByPnr(request.getPersonCPRNummer());
return response;
}
}
存储库:
package dk.dxc.soapdemo.repositories;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
// "Cannot be resolved" error
import dk.dxc.soapdemo.models.PersonUdland;
@Repository
public class PersonUdlandRepository {
@Autowired
private JdbcTemplate jdbcTemplate;
// "Cannot be resolved" error on return type
public PersonUdland getPersonUdlandByPnr(String pnrNumber) {
Map<String, Object> resultSet = jdbcTemplate.queryForMap(sqlQuery, pnrNumber);
// "Cannot be resolved" error
PersonUdland personUdland = new PersonUdland();
//set fields on personUdland and return
}
}
型号:
package dk.dxc.soapdemo.models;
public class PersonUdland {
// Fields that are all Strings
// Getters and setters
}
编辑:添加数据库配置
数据库是通过application.properties配置的
spring.datasource.url=jdbc:db2://path:to/db
spring.datasource.username=user
spring.datasource.password=pass
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
spring.datasource.tomcat.name=DBName
spring.datasource.tomcat.initial-size=1
spring.datasource.tomcat.maxActive=50
spring.datasource.tomcat.test-on-connect=true
spring.datasource.tomcat.max-wait=20000
spring.datasource.tomcat.max-idle=15
spring.datasource.tomcat.default-auto-commit=false
spring.datasource.driver-class-name=com.ibm.db2.jcc.DB2Driver
我使用的数据库依赖:
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.ibm.db2.jcc</groupId>
<artifactId>db2jcc</artifactId>
<version>db2jcc4</version>
</dependency>
<dependency>
<groupId>com.ibm.db2</groupId>
<artifactId>db2jcc_license_cisuz</artifactId>
<version>3.69.24</version>
</dependency>
...
【问题讨论】:
-
你也可以发送你的数据库配置类吗?
-
@sevvalai 我已经添加了配置
-
你说的
when I run clean install with eclipse's maven (not maven wrapper), no error shows,也可以在vscode中访问,由扩展Maven for JAVA提供。你试过了吗? -
我已经尝试过了,它给出了与使用包装器相同的错误。无论如何我都应该使用包装器。
-
@Kikkomann 我没有看到数据库配置类,但是您是否添加了扫描数据库配置中的模型包的行?
标签: java spring-boot maven visual-studio-code classnotfoundexception