Reputation: 11
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
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