gpt4 book ai didi

java - Autowired DAO 对象为 null Spring Boot

转载 作者:行者123 更新时间:2023-11-29 07:02:40 25 4
gpt4 key购买 nike

我正在编写一个休息服务,它可以访问数据库以查看、添加和更新 mysql 表中的字段。我已经使用 Spring Boot 实现了这一点。

事实是,当我尝试 Autowiring DAO 对象时,它不起作用,为 null,因此我的应用程序总是抛出 NullPointerException。

这是我的应用程序类:

@SpringBootApplication
@EnableSwagger2
@ComponentScan(basePackages = "com.setoncios.api")
@EnableJpaRepositories("com.setoncios.api.dao.workers.WorkerDAO.java")
public class GenericApiApplication {

public static void main(String[] args) {
SpringApplication.run(GenericApiApplication.class, args);
}

@Bean
public Docket swaggerSettings() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build()
.pathMapping("/");
}

这是我的 pom.xml:

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>

<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.6.1</version>
</dependency>

<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.6.1</version>
</dependency>


</dependencies>

这是我的 DAO 实现:

@Component
public interface WorkerDAO extends CrudRepository<Persona,String>{

}

包含抛出异常的方法的其余方法:

@RequestMapping(value = "/worker", method = RequestMethod.POST)
public ResponseEntity<?> addWorkerInDatabase(HttpServletRequest request,
@RequestParam(value = "json", defaultValue =
"{\"dni\":\"00000000A\",\"nombre\":\"Paco\",\"apellido1\":\"Ruiz\",\"apellido2\":\"Díaz\"}") final String json){
ProcessAction object = new AddWorkerInDatabaseAction(request, json);
return object.createResponse();
}

以及类本身:

public class AddWorkerInDatabaseAction extends ProcessAction{
private String json;

@Autowired
private UserDatabase userDb = new UserDatabase();

@Autowired
private WorkerDAO workDb;

public AddWorkerInDatabaseAction(HttpServletRequest request, String json) {
super(request);
this.json = json;
}

@Override
protected Object action() throws ExpectedException {
Persona newWorker = new Gson().fromJson(json, Persona.class);
Cookie c = findCookie("userdata");
String[] loggedUser = null;

if(newWorker == null){
LOGGER.warning("Unable to decrypt from json to Persona.");

} else if(c == null){
LOGGER.info("Couldn't find cookie. Unable to add a worker.");
newWorker = null;

} else {
try {
userDb.connect();

loggedUser = c.getValue().split(":");

if(!loggedUser[0].equals("00000000A") || !loggedUser[1].equals(userDb.selectPassword("00000000A"))){
LOGGER.warning("You need privileges to add a worker.");

} else if(newWorker.getNombre() == null || newWorker.getApellido1() == null || newWorker.getApellido2() == null){
workDb.save(newWorker); //Here's where the exception is being thrown.

} else {
workDb.save(newWorker); //Here's where the exception is being thrown.
}


} catch (ClassNotFoundException e) {
userDb.rollback();
newWorker = null;
LOGGER.warning("Exception with driver encountered.");
throw new ExpectedException(1, e.getMessage());

} catch (SQLException e) {
userDb.rollback();
newWorker = null;
throw new ExpectedException(2, e.getMessage());

} finally {
userDb.commit();
userDb.disconnect();
}
}


return newWorker;
}

}

我读过很多帖子,但没有找到可行的方法。有没有我漏写的注释?

预先感谢您:3

编辑。应用答案后,我的主课:

@SpringBootApplication
@EnableSwagger2
@ComponentScan(basePackages = "com.setoncios.api")
@EnableJpaRepositories("com.setoncios.api.dao.workers")
public class GenericApiApplication {

public static void main(String[] args) {
SpringApplication.run(GenericApiApplication.class, args);
}

@Bean
public Docket swaggerSettings() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build()
.pathMapping("/");
}

}

其余方法:

@RequestMapping(value = "/worker", method = RequestMethod.POST)
public ResponseEntity<?> addWorkerInDatabase(HttpServletRequest request,
@RequestParam(value = "json", defaultValue =
"{\"dni\":\"00000000A\",\"nombre\":\"Paco\",\"apellido1\":\"Ruiz\",\"apellido2\":\"Díaz\"}") final String json){
return addDB.createResponse(request, json);
}

以及 AddWorkerInDatabaseAction 类:

@Service
public class AddWorkerInDatabaseAction extends ProcessAction{
@Autowired
private UserDatabase userDb = new UserDatabase();

@Autowired
private WorkerDAO workDb;

public AddWorkerInDatabaseAction() {
}

@Override
protected Object action(Object...args) throws ExpectedException {
Persona newWorker = new Gson().fromJson((String) args[1], Persona.class);
workDb.save(newWorker);


return newWorker;
}

}

希望它对某人有帮助。

最佳答案

您可以将 AddWorkerInDatabaseAction 类设为 Spring 服务。此外,您可以直接将参数传递给实际方法,而不是将参数传递给构造函数。

 @Service
public class AddWorkerInDatabaseAction extends ProcessAction{
.....

protected Object action(HttpServletRequest request, String json) throws ExpectedException {
.....
}

在你的 Controller 中,你可以 Autowiring spring 创建的此类的 bean,

 private class MyController{

@Autowire
ProcessAction object;

@RequestMapping(value = "/worker", method = RequestMethod.POST)
public ResponseEntity<?> addWorkerInDatabase(HttpServletRequest request,
@RequestParam(value = "json", defaultValue =
"{\"dni\":\"00000000A\",\"nombre\":\"Paco\",\"apellido1\":\"Ruiz\",\"apellido2\":\"Díaz\"}") final String json){
return object.createResponse(request, json);
}

关于java - Autowired DAO 对象为 null Spring Boot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42815452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com