当前位置: 首页 > 知识库问答 >
问题:

@Autowired在可运行单元内不起作用

骆昊阳
2023-03-14

我有一个可运行的任务,我试图自动连接字段,但当我这样做时,任务不会运行。当我自动连接runnable外部的字段时,它工作正常。为什么会发生这种情况?还有没有其他更简单的方法可以在runnable中获取自动安装字段的新实例,而不是在内部自动安装它?

这是我的可运行方法”

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个答案

柳昊焱
2023-03-14

Spring不@autowire任何东西进入非托管实例(您使用new创建的实例,与Spring创建和管理的实例相反)。

这给你留下了以下选择:

  • @autowire外部的依赖项,并将其传递给Runnable(或使其可由Running访问)
  • 创建一个新的类子类Runnable,并在需要的地方创建@autowire
  • 不需要注入依赖项,而是在需要时查找它(applicationContext.getBean(..)

使用线程时要小心作用域和延迟初始化,因为一些Spring作用域(例如“请求”或“会话”作用域)是线程本地绑定的(例如,在新线程中使用延迟请求作用域依赖项时,该依赖项在执行时不再与当前请求关联)。

孙渝
2023-03-14

@Autowire不能用于匿名类(因为您调用new,而不是Spring),您可以在外部类中自动连接一个字段,然后在Runnable中使用该字段。

或者使Runnable成为一个完整的类(不是匿名的)并使其成为bean(并自动装配,例如使用id

秦炜
2023-03-14

问题是Spring不能控制可运行文件的创建。有几种可能的解决方案:

  1. 将可运行的创建放在一些服务、存储库、控制器、组件或spring曾经处理过的内容中:

示例:

@Service
public class SomeService {

    @Autowired
    private ICruxPanelClientService cruxPanelClientService;

    public Runnable newRunnable() {

        return new Runnable() {

            public void run() {
                cruxPanelClientService <- will be visible here and injected
            }
        }
    }

}

示例:

@Configuration
public class Runnableconfiguration {

    @Bean
    @Scope("prototype")
    public Runnable newRunnbale(final ICruxPanelClientService cruxPanelClientService) {
        return new Runnable() {
            public void run() {
                cruxPanelClientService <- will be visible here
            }
        }
    }
}
 类似资料:
  • 问题内容: 当我运行TaskJob时,我得到了空指针异常,因为Spring不会自动装配serviceJob服务。是新线程导致此问题,因为Spring自动连接mysqlService没有任何问题? 我的applicationContext.xml; 我的课是; 编辑: TaskJob实例化; 问题答案: Spring仅自动装配其创建的组件。您正在调用新的TaskJob(),Spring不知道该对象,

  • 我已经尝试在表视图单元格中硬编码行高。运行程序后,它看起来只有一行。我怀疑这是因为表视图的行的高度。 你能告诉我这里出了什么问题吗?

  • 我试图在单击按钮或菜单项时将用户重定向到另一个页面。不幸的是,onClick函数只在运行时起作用,在实际单击时不起作用,我不知道为什么。 这是我的功能 如果我调用函数时没有这样的回调 它在运行时调用,而不是在实际单击按钮或菜单项时调用。被调用的函数没有任何问题(我尝试过在单击时console.log一些东西,但没有结果)。 我错过了什么或做错了什么?

  • 问题内容: Netbeans说我的三元运算符不是语句。怎么会? 我尝试过if / then / else对应项,并且工作正常: 问题答案: 三元运算符中的语句必须是非空的。他们需要退货。

  • 我对SonarRunner有以下问题。 SonarQube 以及 Sonar 运行器无法拉取 junit 格式的 xml 报告 “单元测试”或“测试覆盖率”小组件不显示。它说没有数据。我正在按照此处描述的说明进行操作 我按照描述手动创建了XML格式的报告文件,但是仍然没有成功。 下面是 XML 文件 - TEST-Firefox_210_Mac_OS.com.company.BarTest.xml

  • 我是JPA新手,正在使用spring数据。我想建立一个多单单向关系。我的表格是国家和地区,正如预期的那样,关系是许多国家属于一个地区。我尝试从Country实体获取所有数据,但失败了,出现以下错误。 错误 区域类别 国家/地区级 存储库 测试用例 错误-异常 堆栈跟踪 导致此问题的原因是什么?无法转换为内部表示是什么意思?如何克服这个问题?