我有一个如下课程:
AsyncContextThread
如何访问 Child 类中的 getdata()函数。我正在获取服务对象的空指针异常,但我有< strong> autowired ApplicationPropertiesServiceImpl
答案 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)
}
}