Проблема с методом stati c и исключением пустого указателя Spring Boot - PullRequest
0 голосов
/ 15 апреля 2020

Когда я тестировал свой код в одном классе "DeploiementController", он работал хорошо. Но теперь я разделил код на 2 класса. Но я столкнулся с проблемой ... Моя IDE хочет, чтобы я поставил в моей переменной "private stati c", поэтому я сделал это. Я знаю, что CategorieNamespace catnamespace = categorienamespacerepository.findBynamespacename(namespacename); может быть нулевым, это нормально, и поэтому я проверяю его сразу после.

Но проблема в том, что теперь он имеет sh! с исключением нулевого указателя ..

Мой класс DeploiementController:

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;
            }
    }
}

Класс GenerateNewDeploiementHistory:

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;



    }

}

Я надеюсь понять, что не так :)

Ответы [ 3 ]

1 голос
/ 15 апреля 2020

Spring Framework связывает компоненты в bean-компонент, который регистрируется в контейнере, но даже если вы поместите «аннотацию @Component» в GenerateNewDeploymentHistory, Spring не сможет автоматически подключать и вводить значения в полях c. Вам нужно подключить их самостоятельно.

1 голос
/ 15 апреля 2020

Spring logi c экземпляров инъекций полностью против состояния c logi c.

Просто удалите все ссылки c

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();     

Integer IdNamespace = 0;

1 голос
/ 15 апреля 2020

Вам не хватает @Component аннотации на GenerateNewDeploymentHistory. Обратите внимание, что автопроводка работает только на компоненты. Более того, поскольку эти компоненты создаются во время выполнения, поля stati c не могут быть подключены автоматически. Способ автоматического подключения поля stati c состоит в том, чтобы создать нестатический сеттер c для поля и использовать аннотацию @Autowired на сеттере. Таким образом, поле будет автоматически подключено, но во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...