接口的注入CDI返回NullPointerException

时间:2016-05-20 09:41:18

标签: jax-rs cdi

我在Java中注入有问题,因为我想注入一个名为RemoteStatisticService的接口,但在这种情况下它会一直返回null,因此错误NullPointerException。我尝试使用init()方法和@PostConstruct跟踪this,但仍然给出了同样的错误。

以下是MeasurementAspectService类的代码:

import javax.annotation.PostConstruct;
import javax.inject.Inject;

import *.dto.MeasureDownloadDto;
import *.dto.MeasureUploadDto;
import *.rs.RemoteStatisticService;

public class MeasurementAspectService {

    private @Inject RemoteStatisticService remoteStatisticService;

    public void storeUploadDto(MeasureUploadDto measureUploadDto) {

        remoteStatisticService.postUploadStatistic(measureUploadDto);

    }

    public void storeDownloadDto(MeasureDownloadDto measureDownloadDto) {

        remoteStatisticService.postDownloadStatistic(measureDownloadDto);

    }

    @PostConstruct
    public void init() {

    }

}

以下是接口类RemoteStatisticService

的代码
import static *.util.RemoteServiceUtil.PRIV;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import *.dto.MeasureDownloadDto;
import *.dto.MeasureUploadDto;

@Path(PRIV + "stats")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public interface RemoteStatisticService {
    @POST
    @Path("upload")
    void postUploadStatistic(MeasureUploadDto mud);

    @POST
    @Path("download")
    void postDownloadStatistic(MeasureDownloadDto mdd);

}

感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:1)

问题在于您已使用aspectj定义了一个方面,但正在尝试获取对CDI bean的引用。这不会起作用。

这一行是罪魁祸首:

private final MeasurementAspectService measurementAspectService = new MeasurementAspectService();

您需要使用CDI来获取参考。如果您正在使用CDI 1.1,则可以使用此代码段。

private final MeasurementAspectService measurementAspectService = CDI.current().select(MeasurementAspectService.class).get();

这是因为AspectJ不适合CDI使用。请注意,您也可以在CDI中使用interceptors

答案 1 :(得分:0)

CDI 1.1+默认使用隐式bean。您需要将@Dependent@ApplicationScoped之类的bean定义注释添加到您希望被CDI选中的任何类中。