自动连线的实例为null,并导致NullPointerException

时间:2019-03-28 19:33:18

标签: java spring vaadin autowired

在第一种情况下,自动装配的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
}

1 个答案:

答案 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;
    }
}