2016-05-20 17 views
0

Ich habe ein Problem mit der Injektion in Java, wie ich eine Schnittstelle mit dem Namen RemoteStatisticService injizieren möchte, aber es wird in diesem Fall Null Fehler NullPointerException zurückgegeben. Ich habe versucht, this mit init() Methode und @PostConstruct zu folgen, aber gibt mir immer noch den gleichen Fehler. HierInjection CDI der Schnittstelle gibt NullPointerException zurück

ist der Code für MeasurementAspectService Klasse:

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() { 

    } 

} 

Hier ist der Code für die Interface-Klasse 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); 

} 

Jede Hilfe sehr geschätzt wird. Danke

+0

Um für die Injektion gültig zu sein, müssen sie als '@ Named'-Beans markiert sein, damit Ihr CDI-Provider diese verarbeiten kann, z. 'Weld' – PDStat

+0

Wohin soll ich @Named Beans in diesem Fall setzen? Ich benutze Maven und immer noch neu mit CDI –

+0

Auf Klassenebene z. '@Named öffentliche Klasse MeasurementAspectService' – PDStat

Antwort

0

CDI 1.1+ arbeitet standardmäßig mit impliziten Beans. Sie müssen eine Bean-definierende Annotation wie @Dependent oder @ApplicationScoped zu jeder Klasse hinzufügen, die Sie von CDI erhalten möchten.

1

Das Problem ist, dass Sie einen Aspekt mit aspectj definiert haben, aber versuchen, einen Verweis auf eine CDI-Bean zu erhalten. Das wird nicht funktionieren.

Diese Linie ist hier der Täter:

private final MeasurementAspectService measurementAspectService = new MeasurementAspectService();

Sie benötigen CDI verwenden, um einen Verweis zu erhalten. Wenn Sie CDI 1.1 verwenden, können Sie dieses Snippet verwenden.

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

Dies liegt daran, AspectJ nicht für CDI Gebrauch bestimmt ist. Beachten Sie, dass Sie auch interceptors in CDI verwenden können.

+0

gibt es einen Fehler von CDI, da es keinen Verweis auf erhalten konnte es. Benötige ich ein anderes zu importierendes Paket? Ich benutze Maven und ich glaube, ich benutze Javax-Paket aus javax.validation Gruppe (Artefakt-Validierung-API) der Version 1.1.0.Final –

+0

ok Ich habe den vorherigen Fehler behoben, jetzt kommt der neue Fehler als "Ausnahme beim Initialisieren MeasurementAspect: java.lang.IllegalStateException: CDIProvider kann nicht gefunden werden " –

+0

Sind Sie sicher, dass Sie CDI verwenden? –