在某些控制器方法中,自动有线JPA存储库为空

时间:2020-11-08 06:54:56

标签: java spring spring-boot spring-mvc spring-data-jpa

我有一个这样的JPAR存储库

@Repository
public interface RestaurantRepo extends JpaRepository<Restaurant, String> {
    Optional<Restaurant> findByName(String name);

    Optional<List<Restaurant>> findAllByMerchantId(String merchantId);
}

然后我有一个控制器,用于在其中初始化存储库

@Autowired
RestaurantRepo restaurantRepo;

然后我有一种使用存储库的方法

@PreAuthorize("hasRole('ROLE_SUPER_ADMIN')")
    @GetMapping("/disable")
    public ResponseEntity<CustomResponse> disableUser(String username, boolean disable) {

        Restaurant restaurant = restaurantRepo.findById(username).get();
        restaurant.setDisabled(disable);

        CustomResponse er = new CustomResponse();
        er.setStatus("Successful");
        if (disable) {
            er.setMessage("Restaurant is disabled");
        } else {
            er.setMessage("Restaurant is enabled");
        }
        restaurantRepo.save(restaurant);
        return new ResponseEntity<>(er, new HttpHeaders(), HttpStatus.OK);
    }

只要我按下此api,它就可以正常工作。 然后我有另一种这样的方法

@PreAuthorize("hasAnyRole('ROLE_SUPER_ADMIN','ROLE_RESTAURANT')")
    @GetMapping("/get")
    private ResponseEntity<Restaurant> getRestaurant(Principal principal) {
        String username = principal.getName();
        System.out.println("username "+username); //prints the valid username
        System.out.println("RestRepo "+restaurantRepo); //prints null
        Restaurant restaurant;
        Optional<Restaurant> opt = restaurantRepo.findById(username); //prints Exception here
        if (opt.isPresent()) {
            restaurant = opt.get();
            return new ResponseEntity<>(restaurant, HttpStatus.OK);
        } else {
            restaurant = new Restaurant();
            return new ResponseEntity<>(restaurant, HttpStatus.NOT_FOUND);
        }

    }

在这里,我在此行Optional<Restaurant> opt = restaurantRepo.findById(username);

中收到NullPointerException

用户名是有效的用户名,因此当我打印restaurantRepo时,我得到null

我对为什么变量在一个方法中不为空而在另一方法中为空感到困惑。任何帮助,将不胜感激。谢谢

1 个答案:

答案 0 :(得分:1)

不确定。但是,尝试将第二种方法中的访问修饰符更改为 public
请参阅此thread

也可以使用构造函数注入代替@Autowired注释。