gpt4 book ai didi

java - Spring Boot 静态方法和空指针异常问题

转载 作者:行者123 更新时间:2023-12-01 19:26:57 25 4
gpt4 key购买 nike

当我在单个类“DeploiementController”中测试我的代码时,它运行良好。但现在,我已将代码分为两类。但我面临一个问题..我的IDE希望我把我的变量设置为“私有(private)静态”,所以我这样做了。我知道 CategorieNamespace catnamespace = categorienamespacerepository.findBynamespacename(namespacename); 可以为 null,这是正常的,这就是我之后测试它的原因。

但问题是现在它崩溃了!出现空指针异常..

我的部署 Controller 类:

package com.ent.intra.devops.endpoint;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.ent.intra.devops.errors.NotFoundException;

import com.ent.intra.devops.getterclasses.DeploiementObject;
import com.ent.intra.devops.infrastructure.historydeployment.GenerateNewDeploymentHistory;

@RestController
public class DeploiementController {
//ajouter un element dans historique de deploiement
@PostMapping(value = "/addhistorydeployment")
public String AddHistoriqueDeployment(@RequestBody DeploiementObject deploiementrecu) {
if(deploiementrecu == null) {
throw new NotFoundException("L'objet reçu est vide...");
}else {
String Resultat = GenerateNewDeploymentHistory.AddHistoriqueDeploymentMethod(deploiementrecu);
return Resultat;
}
}
}

GenerateNewDeploimentHistory 类:

package com.ent.intra.devops.infrastructure.historydeployment;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;

import com.ent.intra.devops.accessingdatamysql.CategorieNamespaceRepository;
import com.ent.intra.devops.accessingdatamysql.HistoriqueDeploiementRepository;
import com.ent.intra.devops.accessingdatamysql.ServiceNamespaceRepository;
import com.ent.intra.devops.errors.NotFoundException;
import com.ent.intra.devops.getterclasses.CategorieNamespace;
import com.ent.intra.devops.getterclasses.DeploiementObject;
import com.ent.intra.devops.getterclasses.HistoriqueDeploiementObjectInsertion;
import com.ent.intra.devops.getterclasses.ServicesNamespace;

public class GenerateNewDeploymentHistory {

@Autowired
private static HistoriqueDeploiementRepository historiquedeploiementrepository;

@Autowired
private static CategorieNamespaceRepository categorienamespacerepository;

@Autowired
private static ServiceNamespaceRepository servicenamespacerepository;

public static String AddHistoriqueDeploymentMethod(DeploiementObject deploiementrecu) {

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
Date date = new Date();
Integer IdNamespace = 0;
Integer IdService = 0;
String namespacename = deploiementrecu.getNamespace();
String servicename = deploiementrecu.getService();
String dateajout = dateFormat.format(date);
System.out.println(namespacename);



// Problem appears here "CategorieNamespace catnamespace...."
// 2020-04-15 11:21:26.743 ERROR 14868 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]
// : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
// [Request processing failed; nested exception is java.lang.NullPointerException] with root cause java.lang.NullPointerException: null

CategorieNamespace catnamespace = categorienamespacerepository.findBynamespacename(namespacename);
ServicesNamespace servnamespace = servicenamespacerepository.findByservicename(servicename);


try {
if(catnamespace != null) {
IdNamespace = catnamespace.getId();
System.out.println("id namespace : " +IdNamespace);
}else {
CategorieNamespace NewNameSpace = new CategorieNamespace();
NewNameSpace.setNamespacename(namespacename);
NewNameSpace.setDateajout(dateajout);
categorienamespacerepository.save(NewNameSpace);
IdNamespace = NewNameSpace.getId();
System.out.println("L'ID Namespace vient d'être crée : "+ IdNamespace);
}
}catch (Exception ex) {
throw new NotFoundException("La recherche du Namespace a échoué.");
}


try {
if(servnamespace != null) {
IdService = servnamespace.getId();
System.out.println("id Service : " +IdService);
}else {
ServicesNamespace NewService = new ServicesNamespace();
NewService.setServicename(servicename);
NewService.setDateajout(dateajout);
servicenamespacerepository.save(NewService);
IdService = NewService.getId();
System.out.println("L'ID Service vient d'être crée : "+ IdService);
}
}catch (Exception ex) {
throw new NotFoundException("La recherche du Service a échoué.");
}

HistoriqueDeploiementObjectInsertion NewHistorique = new HistoriqueDeploiementObjectInsertion();
NewHistorique.setIdnamespace(IdNamespace);
NewHistorique.setIdservicenamespace(IdService);
NewHistorique.setTagversion(deploiementrecu.getTagversion());
NewHistorique.setDatedeploiement(deploiementrecu.getDatedeploiement());
NewHistorique.setDatecreationtag(deploiementrecu.getDatecreationtag());
NewHistorique.setActionby(deploiementrecu.getActionby());
NewHistorique.setDateajout(dateajout);
historiquedeploiementrepository.save(NewHistorique);
return dateajout;



}

}

我希望明白出了什么问题:)

最佳答案

Spring注入(inject)实例的逻辑与静态逻辑完全相反。

只需删除所有静态引用

package com.ent.intra.devops.endpoint;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.ent.intra.devops.errors.NotFoundException;

import com.ent.intra.devops.getterclasses.DeploiementObject;
import com.ent.intra.devops.infrastructure.historydeployment.GenerateNewDeploymentHistory;

@RestController
public class DeploiementController {

@Autowired // here you are injecting an instance
GenerateNewDeploymentHistory generateNewDeploymentHistory;

//ajouter un element dans historique de deploiement
@PostMapping(value = "/addhistorydeployment")
public String AddHistoriqueDeployment(@RequestBody DeploiementObject deploiementrecu) {
if(deploiementrecu == null) {
throw new NotFoundException("L'objet reçu est vide...");
}else {
String Resultat = generateNewDeploymentHistory.AddHistoriqueDeploymentMethod(deploiementrecu);
return Resultat;
}
}
}

另一个类:

@Component // Here you declare that spring should create an instance
public class GenerateNewDeploymentHistory {

@Autowired // no static
private HistoriqueDeploiementRepository historiquedeploiementrepository;

@Autowired
private CategorieNamespaceRepository categorienamespacerepository;

@Autowired
private ServiceNamespaceRepository servicenamespacerepository;

// neither static
public String AddHistoriqueDeploymentMethod(DeploiementObject deploiementrecu) {

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
Date date = new Date();

整数 IdNamespace = 0;

关于java - Spring Boot 静态方法和空指针异常问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61225479/

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