This question already has answers here:
Why is my Spring @Autowired field null?
                            
                                (17个答案)
                            
                    
                在16天前关闭。
        

    

在春季启动应用程序中,我试图加载yaml属性文件,并试图在@Autowire注释中的此类中使用该类,而在另一个类中获取null指针除外

@Component
@Slf4j
@Data
public class ServiceGridConfiguration {

    public  AdapterConfig adapterConfig;



    public ServiceGridConfiguration() {
        Yaml yaml = new Yaml();
            String yamlFile ="ServiceGrid.yaml";
            try {

                AdapterConfig adapterConfig = yaml.loadAs( ServiceTypeResolver.class.getClassLoader()
                        .getResourceAsStream(yamlFile),AdapterConfig.class );
                System.out.println("adapterConfig" + adapterConfig.getSeedGroup());

                 this.adapterConfig = adapterConfig;

            } catch (Exception e) {
                log.error("Error in reading adapterConfig file "+yamlFile,e);
            }

    }

    }


在上面的构造函数中,可以在加载时在构造函数中打印,但是在击中rest端点时会得到空指针异常

public class ServiceGrid implements IhubStrategy {

    @Autowired
    ServiceGridConfiguration sfg;


    @Override
    public void processRequest(String message) throws Exception {
        System.out.println("ServiceGrid   "+message+"*******"+sfg.getAdapterConfig().getSeedEntity());
    }

}


@零件
公共类IhubStrategyFactory {

@Autowired
ServiceGridConfiguration sfg;

@Autowired
ServiceGrid sg;

public IhubStrategy getIhubStrategy(String serviceDefinition) {

    System.out.println("IhubStrategyFactory : "+sfg.getAdapterConfig().getSeedEntity());


// IhubStrategy strategy = null;

    if (serviceDefinition.equalsIgnoreCase("serviceGrid")) {

        return new ServiceGrid();
        /*try {
            sg.processRequest("serviceGrid");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }*/

    } else if (serviceDefinition.equalsIgnoreCase("TopologyResponse")) {


//策略=新的TopologyResponse();
        }

    return null;
}


}

@Component
public class IhubStrategyFactory {

    @Autowired
    ServiceGridConfiguration sfg;

    @Autowired
    ServiceGrid sg;

    public IhubStrategy getIhubStrategy(String serviceDefinition) {

        System.out.println("IhubStrategyFactory : "+sfg.getAdapterConfig().getSeedEntity());

//      IhubStrategy strategy = null;

        if (serviceDefinition.equalsIgnoreCase("serviceGrid")) {

            return new ServiceGrid();
            /*try {
                sg.processRequest("serviceGrid");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }*/

        } else if (serviceDefinition.equalsIgnoreCase("TopologyResponse")) {
//          strategy = new TopologyResponse();
        }

        return null;
    }
}

最佳答案

您必须使用@Componenet或@Service注释ServiceGrid,因为此刻它尚未在Spring Context中加载,并且ServiceGridConfiguration无法自动装配。

@Service
public class ServiceGrid implements IhubStrategy {

    @Autowired
    ServiceGridConfiguration sfg;


    @Override
    public void processRequest(String message) throws Exception {
        System.out.println("ServiceGrid   "+message+"*******"+sfg.getAdapterConfig().getSeedEntity());
    }

}

09-20 22:20