CDI @Inject无法工作,对象保持为空

时间:2016-10-26 15:10:05

标签: java netbeans cdi

我正在尝试使用CDI,使用@Inject进行依赖注入,但我的对象保持null并且不会初始化...更准确地说: 我有一个带有WeatherController的web应用程序,它使用我的所有模块的java应用程序。在Java应用程序中,我有ForecastService,我尝试使用CDI初始化我的存储库而没有成功... 我试过/搜索了很多..希望有人可以帮助我吗?

我有一个使用此控制器的Web应用程序:

@Path("/weather")
public class WeatherController {

    private ForecastService forecastService;
    //private ForecastRepository forecastRepository = new ForecastFakeDB();
    //private ObservationRepository observationRepository = new ObservationFakeDB();

    public WeatherController() {
        //this.forecastService.setForecastRepository(forecastRepository);
        //forecastService.setObservationRepository(observationRepository);
        forecastService  = new ForecastService();
    }

    //localhost:8080/DA_project_weatherPredictions/api/weather/observation/Leuven
    @GET
    @Produces({"application/json"})
    @Path("/observation/{location}")
    public Response getObservation(@PathParam("location") String location) {
        try {
            ObjectMapper mapper = new ObjectMapper();
            Observation observation = forecastService.getCurrentObservation(location);
            //Object to JSON in String
            String jsonInString = mapper.writeValueAsString(observation);
            return Response.status(200).entity(jsonInString).build();
        } catch (Exception ex) {
            System.out.println("error");
            System.out.println(ex.getMessage());
            ex.printStackTrace();
            return null;
        }
    }

这完美无缺。这是我的forecastService:

public class ForecastService implements Service {

    @Inject
    ForecastRepository forecastRepository;

    @Inject
    ObservationRepository observationRepository;

    private Client client;
    private WebTarget webTargetObservation, webTargetForecast;

    public ForecastService() {
//        WeatherRepositoryFactory weatherRepositoryFactory = new WeatherRepositoryFactory();
//        forecastRepository = weatherRepositoryFactory.getForecastRepository(repository);
//        observationRepository = weatherRepositoryFactory.getObservationRepository(repository);
        loadWeather();
    }    

    public void setForecastRepository(ForecastRepository forecastRepository) {
        this.forecastRepository = forecastRepository;
    }

    public void setObservationRepository(ObservationRepository observationRepository) {
        this.observationRepository = observationRepository;
    }    

    public void loadWeather() {
        //http://api.openweathermap.org/data/2.5/weather?units=metric&appid=12fa8f41738b72d954b6758d48e129aa&q=BE,Leuven
        //http://api.openweathermap.org/data/2.5/forecast?units=metric&appid=12fa8f41738b72d954b6758d48e129aa&q=BE,Leuven
        client = ClientBuilder.newClient();
        webTargetObservation = client.target("http://api.openweathermap.org/data/2.5/weather")
            .queryParam("mode", "json")
            .queryParam("units", "metric")
            .queryParam("appid", "12fa8f41738b72d954b6758d48e129aa");
        webTargetForecast = client.target("http://api.openweathermap.org/data/2.5/forecast")
            .queryParam("mode", "json")
            .queryParam("units", "metric")
            .queryParam("appid", "12fa8f41738b72d954b6758d48e129aa");        
    }

    public Observation getCurrentObservation(String location) throws Exception {
        Observation observation;
        observation = observationRepository.getObservation(location);
        if (observation == null) {
            try {
                //observation = webTargetObservation.queryParam("q", location).request(MediaType.APPLICATION_JSON).get(Observation.class);
                Response response = webTargetObservation.queryParam("q", location).request(MediaType.APPLICATION_JSON).get();
                String json = response.readEntity(String.class);
                //System.out.println(json);
                response.close();
                observation = new ObjectMapper().readValue(json, Observation.class);
                //System.out.println(observation.getWeather().getDescription());
            }
            catch (Exception e){
                StringBuilder sb = new StringBuilder(e.toString());
                for (StackTraceElement ste : e.getStackTrace()) {
                    sb.append("\n\tat ");
                    sb.append(ste);
                }
                String trace = sb.toString();
                throw new Exception (trace);
                //throw new Exception("Location not found");
            }
            this.observationRepository.addObservation(observation, location);
        }
        return observation;
    }

所以问题是我的存储库保持null

@Alternative
public class ObservationDB implements ObservationRepository{

    //as ID we can use the ASCI value of the String key .. example uklondon to ASCII

    public ObservationDB(String name) {

    }   

    @Override
    public Observation getObservation(String location) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void addObservation(Observation observation, String location) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}

Mermory DB:

@Default
public class ObservationFakeDB implements ObservationRepository {

    //example String key : beleuven, uklondon
    private static Map<String, Observation> observations;

    public ObservationFakeDB() {
        observations = new HashMap<>();
    }

    @Override
    public Observation getObservation(String location) {
        return observations.get(location);
    }

    @Override
    public void addObservation(Observation observation, String location) {
        observations.put(location, observation);
    }
}

我有一个beans.xml,我认为beans.xml,@Inject@Default en @Alternative会使这项工作......我尝试@Dependent,{{ 1}},..

Here my map structure:

编辑: 我也经常在Netbeans上收到这个警告.. enter image description here

我的beans.xml

@Applicationscoped

1 个答案:

答案 0 :(得分:2)

您需要让 CDI容器管理所有您的bean的生命周期,以允许它解析并正确注入其依赖项。

因此,在您的情况下,您不应自己创建ForecastService的实例,只需将字段forecastService@Inject一起注释,就应该将其委托给 CDI容器。 {1}}这样,它的依赖关系将由容器自动解析和设置。

public class WeatherController {

    @Inject
    private ForecastService forecastService;

    ...