2016-05-20 4 views
0

У меня проблема с инъекцией в Java, так как я хотел бы добавить интерфейс RemoteStatisticService, но в этом случае он возвращает значение null, в результате чего возникает ошибка NullPointerException. Я попытался следовать this с помощью метода init() и @PostConstruct, но все равно дает мне ту же ошибку.Injection CDI интерфейса возвращает NullPointerException

Вот код класса 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); 

} 

Любая помощь приветствуется. Спасибо

+0

Для того, чтобы иметь право на инъекцию, они должны быть отмечены как «@ Именованные» компоненты для вашего поставщика CDI для обработки, например. 'Weld' – PDStat

+0

Где я должен положить @Named beans в этом случае? Я использую Maven и все еще новичок с CDI –

+0

На уровне класса, например. '@Named public class MeasurementAspectService' – PDStat

ответ

0

CDI 1.1+ работает с неявными фасолями по умолчанию. Вам нужно добавить аннотацию, определяющую bean, такую ​​как @Dependent или @ApplicationScoped в любой класс, который вы хотите получить от CDI.

1

Проблема в том, что вы определили аспект с использованием aspectj, но пытаетесь получить ссылку на компонент CDI. Это не сработает.

Эта линия здесь является виновником:

private final MeasurementAspectService measurementAspectService = new MeasurementAspectService();

Вы должны будете использовать CDI, чтобы получить ссылку. Если вы используете CDI 1.1, вы можете использовать этот фрагмент.

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

Это потому, что AspectJ не предназначен для использования CDI. Обратите внимание, что вы также можете использовать interceptors в CDI.

+0

есть ошибка CDI, поскольку он не мог получить ссылку на Это. Нужен ли мне другой пакет для импорта? Я использую Maven, и я считаю, что использую пакет Javax, импортированный из javax.validation group (артефакт validation-api) версии 1.1.0.Final –

+0

ok Я исправил предыдущую ошибку, теперь новая ошибка возникает как «Исключение при инициализации MeasurementAspect: java.lang.IllegalStateException: Не удается найти CDIProvider « –

+0

Вы уверены, что используете CDI? –

Смежные вопросы