2016-10-26 3 views
2

Я пытаюсь использовать CDI, используя @Inject для инъекции зависимостей, но мой объект остается null и не initialze ... точнее: У меня есть WebApplication с WeatherController Wich используйте Java-приложение со всеми моими модулями. В Java-приложении у меня есть ForecastService, где я пытаюсь инициализировать свои репозитории с помощью CDI без succes ... Я пробовал/искал много. Надеюсь, кто-нибудь может мне помочь здесь?CDI @Inject не будет работать, объект остается пустой

У меня есть Используйте веб-приложения, которым этот контроллер:

@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 ru @Alternative сделаю эту работу ... Я пробовал @Dependent, @Applicationscoped, ..

Here my map structure:

EDIT: я часто получаю это предупреждение на Netbeans .. enter image description here

Мой beans.xml

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" 
     bean-discovery-mode="all"> 

</beans> 
+0

Вы пытались просто аннотировать поле 'forecastService' с помощью' @ Inject' вместо того, чтобы создавать его самостоятельно? –

+0

также удаляет 'loadWeather()' из конструктора по умолчанию 'ForecastService' и просто комментирует его с помощью' @ Inject', чтобы указать контейнер CDI, чтобы вызвать его на init –

+0

. Как вы называете «мои репозитории»? –

ответ

2

Вы должны позволить своему CDI контейнер управляет жизненный цикл все ваши бобы, чтобы позволить ему разрешать и правильно вводить свои депеды ndencies.

Таким образом, в вашем случае вы не должны создавать себе экземпляр ForecastService, вы должны скорее передать его в CDI контейнер просто аннотирования поле forecastService с @Inject таким образом, его зависимости будут автоматически разрешены и настраиваются контейнер.

public class WeatherController { 

    @Inject 
    private ForecastService forecastService; 

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