SpringBoot的自动装配问题

时间:2015-10-07 08:16:23

标签: java spring spring-boot

我有一个如下课程:

AsyncContextThread

如何访问 Child 类中的 getdata()函数。我正在获取服务对象的空指针异常,但我有< strong> autowired ApplicationPropertiesServiceImpl

2 个答案:

答案 0 :(得分:0)

好像你将拥有2个控制器。

显然你的控制器做得太多了。将控制器注入另一个控制器并不是一个好主意。

我建议您制作服务和存储库:

模型正在接收来自Controller的大量数据,因此我建议创建一个类以使其更清晰,因为返回Map太抽象并且使代码难以阅读。

public class CarProperties {
    private Integer id;
    private String name;
    private Integer age;
    private String color;
    //setters and gettters
    ....
}

服务:

public interface CarPropertiesService {
   public List<CarProperties> findAll(String type);
}

@Service("CarPropertiesService")
public class CarPropertiesServiceImpl implements CarPropertiesService {
   @Autowired
   private CarPropertiesDAO carPropertiesDAO;

   public List<CarProperties> findAll(String type) {
      List<CarProperties> result = new ArrayList<>();
      if ("XXX".equalsIgnoreCase(type)) {
         List<Map<String, Object>> carPropertiesList = carPropertiesDAO.findAll();
         for(Map<String, Object> carProperties : carPropertiesList) {
            result.add(getCarPropertiesInstance(carProperties));
         }

      }
      return result;
   }

   private CarProperties getCarPropertiesInstance(Map<String, Object> properties) {
      CarProperties instance = new CarProperties();
      instance.setId(properties.get("id"));
      instance.setName(properties.get("name"));
      ...
      return instance;
   }
}

DAO:

public interface CarPropertiesDAO {
   public List<Map<String, Object>> findAll();
}

@Repository("CarPropertiesDAO")
public class CarPropertiesDAOImpl implements CarPropertiesDAO {
   ...
   public List<Map<String, Object>> findAll() {
      String sql = "select * from data.car_properties(?)";
      return jdbcTemplate.queryForList(sql,host);
   }
}

最后你的控制器将使用该服务:

@RestController
public class ControllerClass {
    @Autowired
    private CarPropertiesService carPropertiesService;

    @RequestMapping(value = "/node1", method = RequestMethod.GET)
    @ResponseBody
    public ParentNode getNode1() 
    {
       List<CarProperties> properties = carPropertiesService.findAllByType("XXX");
       return properties;

    }

    @RequestMapping(value = "/prop/{type}/{name}", method = RequestMethod.GET)
    @ResponseBody
    public List<CarProperties> getData(@PathVariable String type,@PathVariable String name) 
   {
      List<CarProperties> rows = carPropertiesService.findAllByType(type);    
      ...
   }
}

@Controller
public class Controller2 {
   @Autowired
   CarPropertiesService carPropertiesService;


   public void addtree(){
      List<CarProperties> rows = carPropertiesService.findAllByType("XXX");
   }
}

恢复:控制器不应该担心业务,而只是返回数据。服务应该是业务所在的位置,如计算,数据交换等...... DAO类可以清楚地看到它用于数据库操作。另请注意,DAO对象的访问应该在Services / Facedes中,在Controller推荐中使用它。因此,使用此结构,您的代码将变得更加可重用且易于维护。

答案 1 :(得分:0)

请试试这个: -

@Component
@ComponentScan(basePackages="<provide your base pkg where it will scan for the component ControllerClass>")
@ConditionalOnBean(ControllerClass.class)
public class Child {
  @Autowired(required=true)
  private ControllerClass controllerClass;

  public void addtree(){
    controllerClass.getData("XXX",xxx)
  }
}