2016-06-25 30 views
1

私はAutowireフィールドにしようとしている実行可能なタスクを持っていますが、実行するとタスクは実行されません。 私はrunnableの外のフィールドをAutowireとき、それは正常に動作します。なぜこうなった ? Autowire以外にもrunnable内のautowiredフィールドの新しいインスタンスを取得するには、他にもクリーンな方法がありますか?@Autowiredは実行可能ファイル内では動作しません

は、ここに私の実行可能method `'s

Runnable task = new Runnable() { 

       @Autowired 
       ICruxPanelClientService CruxPanelClientService; 

       public void run(){ 
      CruxPanelClientService.setCruxWebServiceBaseURL("http://10.41.181.23:8080"); 
      CronCruxModel m = new CronCruxModel(); 
      m = model1.get(model_var); 
      System.out.println("EXECUTING"); 
      System.out.println(m.getService_status() + " ---------EXEexecution"); 
      System.out.println(m.getCat_name() + "Executing Name "); 
     // time = m.getService_time(); 
      UpdateCategoryRequest updateCategoryRequest = new UpdateCategoryRequest(); 
      CategoryModel categoryModel = new CategoryModel(); 
      categoryModel.setColor(m.getCat_color()); 
      categoryModel.setIcon(m.getCat_icon()); 
      categoryModel.setIconWhite(m.getCat_icon_white()); 
      categoryModel.setName(m.getCat_name()); 
      categoryModel.setId(m.getCat_id()); 
      categoryModel.setKey(m.getCat_catkey()); 
      categoryModel.setIndexOrder(m.getCat_indexOrder()); 
      updateCategoryRequest.setCategory(categoryModel); 
      CruxPanelClientService.updateCategory(updateCategoryRequest); 
      GetServiceDataIdByCategoryIdRequest request1 = new GetServiceDataIdByCategoryIdRequest();  
      request1.setId(m.getCat_id()); 
      GetServiceDataIdByCategoryIdResponse response1 = CruxPanelClientService.getServiceDataIdByCategoryId(request1); 
      ArrayList<ServiceModel> service = new ArrayList<ServiceModel>(); 
      service = response1.getServiceModels(); 

      JSONArray json = new JSONArray(); 
      if(m.getService_order_succ_msg()==null) 
      { 
       json = new JSONArray(); 
      } 
      else { 

       json = new JSONArray(m.getService_order_succ_msg()); 
      } 
      String message = m.getService_order_succ_msg(); 

      for (int j=0;j<service.size();j++) 
      { 
       UpdateServiceMasterRequest req = new UpdateServiceMasterRequest(); 
       ServiceModel s = new ServiceModel(); 
       s=service.get(j); 
       ; 
       JSONObject obj = new JSONObject(); 

       if(json.length()==0) 
       { 
        String ms = null; 
        s.setOrderSuccessMessage(ms); 
        req.setServiceModel(s); 

       } 

       else { 

        String message1 = json.get(j).toString(); 

        if(message1.equals(null) || message1.equals("")) { 
         String ms = null; 
         s.setOrderSuccessMessage(ms); 
         req.setServiceModel(s); 

        } 
        else { 
         s.setOrderSuccessMessage(message1); 

         req.setServiceModel(s); 

        } 
       } 
       CruxPanelClientService.updateServiceMaster(req); 

      } 
      m.setService_status("executed"); 
      UpdateCronCruxRequest q = new UpdateCronCruxRequest(); 
      q.setCronCruxModel(m); 
      CruxPanelClientService.updateCronCrux(q); 

       } 
      };` 

答えて

3

(あなたがnewを呼び出すbecause、春ではない)匿名クラスのために使用できないことができ@Autowire、あなたは外部クラスのフィールドをautowireの内部にそのフィールドを使用することができますが、あなたのRunnable

または(idを使用してautowire、例えば)Runnable本格クラス(匿名ではない)を作成し、それ豆作る

+1

'Runnable'が本格的なクラスとして定義されている場合、それはとして宣言する必要があります'@ Autowire'を動作させるためにBeanを使用します。この場合、Beanのスコープは' Prototype'でなければなりません。だから、シングルトンBeanにプロトタイプBeanをオートワイヤリングする必要があります。ここでいくつかの方法を説明します:http://stackoverflow.com/questions/14880847/howto-generate-prototype-objects-with-in-a-singleton- bean-using-spring-java-conf/14881193#14881193 –

関連する問題