SerpentSeraphim666
SerpentSeraphim666

Reputation: 11

Spring Boot Application: Failing to instantiate service class, NullPointerException

I'm having an issue where I'm unable to run a fairly simple spring boot application running off a H2 database.

The application is for allowing users to search for beers from a database using their name or ID, and be returned a paginated list based on their search. I am unable to run or build the application and it has me completely perplexed as I am new to Spring. Any help at all would be highly appreciated.

I will post the error and the code below Screen cap of error here

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.sd4.service.beerService]: Constructor threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:224) ~[spring-beans-5.3.15.jar:5.3.15]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:87) ~[spring-beans-5.3.15.jar:5.3.15]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1326) ~[spring-beans-5.3.15.jar:5.3.15]
    ... 83 common frames omitted
Caused by: java.lang.NullPointerException: null

Beer entity class

  @Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Entity
public class Beer implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private long breweryId;
    private String name;
    private Integer catId;
    private Integer styleId;
    private Double abv;
    private Double ibu;
    private Double srm;
    private Clob description;
    private Integer addUser;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastMod;

    private String image;
    private Double buyPrice;
    private Double sellPrice;

}

Beer Controller

    @Controller
@RequestMapping("/beer")
public class BeerController {
    @Autowired
    private beerService beerService;
        
    
//method to load the add book form. This method also creates a Book object that will back the add book form
 @GetMapping("/add")
public ModelAndView displayAddForm() {
        return new ModelAndView("/all", "aBeer", new Beer());
}

@PostMapping("/searchByName")
public String searchByNameSubmit(@ModelAttribute String name, Model model, @RequestParam("page") Optional<Integer> page, 
      @RequestParam("size") Optional<Integer> size){
    
    int currentPage = page.orElse(1);
        int pageSize = size.orElse(5);

        Page<Beer> beerPage = beerService.findPaginated(PageRequest.of(currentPage - 1, pageSize));

        model.addAttribute("beerPage", beerPage);
            System.out.println("PRINTING PEER PAGE ELEMENTS HERE " + beerPage.getTotalElements());
        int totalPages = beerPage.getTotalPages();
        if (totalPages > 0) {
            List<Integer> pageNumbers = IntStream.rangeClosed(1, totalPages)
                .boxed()
                .collect(Collectors.toList());
            model.addAttribute("pageNumbers", pageNumbers);
        }
    
   //Pageable firstPageWithTwoElements = PageRequest.of(0, 2);
   //Page<Beer> beersByName = beerService.findByName(name, firstPageWithTwoElements);
   //model.addAttribute("name", name, "aBeerList", beerService.findByName(name, pageable));
 //  model.addAttribute(beersByName);     
   return "nameResults";
}

@GetMapping("/displayAll")
public String displayAllPage(Model model){
    model.addAttribute("aBeerList", beerService.findAll());
    return "/viewAllBeers";
}
//method to save the book entity to the DB    
//decide on mapping etc..
@PostMapping("/addBeer")
 public ModelAndView addABeer(@ModelAttribute("aBeer") Beer b, BindingResult result) {
                
        if (result.hasErrors()) {
            return new ModelAndView ("/error");
        }
        Beer newBeer = new Beer();
        newBeer.setName("Test");
        beerService.saveBeer(newBeer);
        beerService.saveBeer(b);
        return new ModelAndView("/viewAll", "beers", beerService.findAll());
        //save the book object to the DB
        //display success page
    }
 
@GetMapping("/")
 public String index(Model model) {
     NameSearch nameSearch = new NameSearch();
     model.addAttribute("NameSearch", nameSearch);
      //response.setHeader("Content-Type","text/html");
      return "index";    
 }
}

Beer Service

    @Service

public class beerService {
     @Autowired
     
       private beerRepository beerRepo;
     
    private List<Beer> beers;
     
    public Page<Beer> findPaginated(Pageable pageable) {
        int pageSize = pageable.getPageSize();
        int currentPage = pageable.getPageNumber();
        int startItem = currentPage * pageSize;
        List<Beer> list;

        if (beers.size() < startItem) {
            list = Collections.emptyList();
        } else {
            int toIndex = Math.min(startItem + pageSize, beers.size());
            list = beers.subList(startItem, toIndex);
        }
            System.out.println("PRINTING LIST BEER ELEMENTS HERE " + list.size());
            System.out.println("PRINTING BEERS SIZE HERE " + beers.size());

        Page<Beer> beerPage
                          = new PageImpl<Beer>(list, PageRequest.of(currentPage, pageSize), beers.size());


        return beerPage;
    }

        // Add this method
   
    public beerService() {
beers = (List<Beer>) beerRepo.findAll() ;
    }

    public Optional<Beer> findOne(Long id) {
        return beerRepo.findById(id);
    }

    public List<Beer> findAll() {
        return (List<Beer>) beerRepo.findAll();
    }
    
    public Page<Beer> findByName(String name, Pageable pageable) {
        String name1 = name;    
        Pageable pageable1 = pageable;
        Page<Beer> beerList;
        beerList = beerRepo.findByName(name1, pageable1);
        return beerList;
    }

    public long count() {
        return beerRepo.count();
    }

    public void deleteByID(long beerID) {
        beerRepo.deleteById(beerID);
    }

    public void saveBeer(Beer a) {
        beerRepo.save(a);
        
    }  
    
    
}

Beer repository

  @Repository
public interface beerRepository extends PagingAndSortingRepository<Beer, Long>   {
List<Beer> findAllBySellPrice(Double sell_price, Pageable pageable);
Page<Beer> findByName(String name, Pageable pageable);

}

Kind regards.

Upvotes: 0

Views: 2184

Answers (1)

Jens
Jens

Reputation: 69440

When calling the constructor the Autowired fields are not initialized.

Initialize the repo at a method which is annotated with @PostConstruct

@PostConstruct
public void init() {
    beers = (List<Beer>) beerRepo.findAll() ;
}

This method wil be called after the bean is fully initialized

Upvotes: 1

Related Questions