在第一种情况下,自动装配的cartService可以正常工作,但是我不知道为什么在第二种情况下,当我想使用自动装配的cartService(在另一个类中)时,将空值作为其值。 这是来源的一部分:
存储库:
@Repository
public interface CartRepository extends JpaRepository<Cart, Integer> {
Cart findById(int id);
}
服务:
public interface CartService{
Iterable<Cart> getAllCart();
Cart getCart(int id);
void save(Cart cart);
}
服务实施:
@Service
public class CartServiceImpl implements CartService{
@Autowired
CartRepository cartRepository;
@Override
public Iterable<Cart> getAllCart() {
return cartRepository.findAll();
}
@Override
public Cart getCart(int id) {
return cartRepository.findById(id);
}
@Override
public void save(Cart cart) {
cartRepository.saveAndFlush(cart);
}
}
@Component
public class ColumnLay extends VerticalLayout {
@Autowired
CartService cartService;
//...some code...cartService works fine
}
UI类
@Route("purchase")
@Component
@UIScope
public class Purchase extends VerticalLayout {
@Autowired
CartService cartService;
//here when I use cartService I get null
//some code goes here
}
答案 0 :(得分:1)
您没有显示在Purchase类中碰巧遇到NullPointerException的地方,但是我怀疑它在构造函数中发生了,因为这样做很有意义。
自动装配在构造对象之后发生。因此,您的自动装配的cartService在构造函数中为null。如果有一个用@PostConstruct
注释的方法,则在自动装配后调用该方法-您的服务将在那里。
或者您可以从字段注入切换到构造函数注入。通过使用构造函数注入,cartService将已经在构造函数中可用。
@Route("purchase")
@Component
@UIScope
public class Purchase extends VerticalLayout {
// no annotation here!
CartService cartService;
//this way cartService is not null in constructor
@Autowired
public Purchase(CartService cartService){
this.cartService = cartService;
}
}