3

ya se que este es un error muy común y sucede cuando se intenta acceder a un objeto de tipo NULL, el problema es que no se por que es NULL si se supone que lo estoy instanciando, Tengo una Clase llamada NoteController en la que instancio un objeto de otra clase llamada CountryController, esta clase CountryController tiene un metodo sencillo que retorna True or False cuando hace una consulta a la base de datos, necesito llamar este metodo desde la clase NoteController pero siempre me lanza la excepcion NullPointerException, ¿Alguno sabe por qué? ... de ante mano Muchas Gracias..

//Esta es mi clase NoteController

//CLASE  NoteController
   package com.myapp.controller;

   import com.myapp.model.Notes;
   import com.myapp.repository.NoteRepository;
   import com.myapp.controller.CountryController;

   @RestController
   @RequestMapping("/api")
   public class NoteController {
     @Autowired
     NoteRepository noteRepository;
     CountryController objCountry = new CountryController();

     //Create a new Note Validation Country
     @PostMapping("/notes")
     public String createNote(@Valid @RequestBody Notes note) {      
         try {
             if (objCountry.existCountry((note.getNOT_COUNTRY()))) {
                 noteRepository.save(note);
                 return "Nota Guardada";
             }else {
                 return "Nota no Guardada";
             }
         }catch(NullPointerException e) {
             return "Se produjo un  error "+ e;
         }
     }
 }

//ESTA ES MI CLASE CountryController

//Clase CountryController

package com.myapp.controller;
import com.MyApp.model.Country;
import com.MyApp.repository.CountryRepository;

@RestController
@RequestMapping("/api")
public class CountryController {


    public CountryController() {}

    @Autowired
    CountryRepository countryRepository;

    //Verify Country
    public Boolean existCountry(String countryId) {
     if (countryRepository.findById(countryId).isPresent()) {
         return true;    
     }else {
         return false;
     } 
    }
}   
Cristian D.
  • 81
  • 1
  • 2
  • 10

3 Answers3

4

La inyección de dependencia es manejada por Spring nunca se debe crear un Controller, Servicio o Repositorio con la palabra reservada "new" esta tarea la delegamos al framework.

4

En NoteController tienes:

@RestController
@RequestMapping("/api")
public class NoteController {
    @Autowired
    NoteRepository noteRepository;
    CountryController objCountry = new CountryController();
    ...
}

Pero CountryController tambien es un componente de Spring:

@RestController
@RequestMapping("/api")
public class CountryController {
    @Autowired
    CountryRepository countryRepository;
    ...
}

Al hacerle new CountryController() sus componentes que tienen @Autowired no se inicializaran y quedaran null, en lugar de crearlo tu mismo, delega la creacion a Spring al igual como ya lo haces con tus NoteRepository y CountryRepository:

@RestController
@RequestMapping("/api")
public class NoteController {
    @Autowired
    NoteRepository noteRepository;
    @Autowired
    CountryController objCountry;
    ...
}
Klaimmore
  • 3,965
  • 1
  • 8
  • 26
4

No hace falta crear con la palabra reservada new.

Spring usa el principio I de SOLID, el cual es la inyeccion de dependencias.

para inyectar una clase basta con colocar la etiqueta @Autowired

en tu caso:

@Autowired
    CountryController objCountry;
userStack
  • 6,330
  • 3
  • 20
  • 41