【问题标题】:Spring - Need to autowire @RestController class in a @Component classSpring - 需要在 @Component 类中自动装配 @RestController 类
【发布时间】:2016-08-05 20:10:39
【问题描述】:

我在同一个 maven 父模块下有 web 和核心项目的组合,

父母 - 网络(com.parent.test.web) - 核心(com.parent.test.core)

我想引用核心项目中的web模块依赖来调用web模块中的一些api

Web 项目示例,

com.test.parent.web

public interface RestInterface {
    public ResponseEntity load();
}

@RestController
public class RestInterfaceImpl implements RestInterface {

    @Override
    @RequestMapping(value = "/getData", method = RequestMethod.GET, produces = APPLICATION_JSON)
    public @ResponseBody ResponseEntity<Object> load() {

    }
}

核心项目示例,

com.test.parent.core

@Component
public class CoreImpl implements CoreInterface {

    // Is this possible to autowire
    @Autowired
    private RestInterface restInterface;

    public boolean getOptions() {
        ResponseEntity<Object> results = restInterface.load();
        for (Object o : results) {
            //TODO
        }
    }
}

因为项目是在同一个父 pom 模块中开发的。所有项目将被分组到一个 springboot jar 中,并将部署到同一个环境中。所以,我想把 web 项目的依赖引用到 core 项目中,并尝试扫描 core 项目中的 web 类。

我想澄清一些事情,

  • 这是好方法吗?
  • 如果是好方法,我们该如何实施?
  • 如果不是,那么正确的方法是什么?

【问题讨论】:

  • 您确定要在核心项目中添加 web 模块项目作为依赖项吗?并且调用 API 不需要添加依赖项。你说的标题是什么意思?
  • 是的。我将接口称为依赖项,而不是访问 Web 模块 uri。标题的意思是将 web 模块 spring bean 类自动装配到 spring 核心项目中。

标签: java spring maven


【解决方案1】:

恕我直言,这绝对不是正确的方法。关注点分离原则表明,控制器应该只是一小段代码,它们从请求中获取参数,将它们传递给业务类,然后转发到将显示结果的视图。

如果你需要从一个核心类中调用控制器的一些方法,这意味着你有一个胖丑的控制器,里面承载着业务方法。正确的做法是将 web 部分 => 控制器与业务部分 => 服务层分开。

这样您就可以创建一个服务 bean,该服务 bean 将在(现在是瘦的)控制器和其他需要调用其方法的核心类中自动装配。

【讨论】:

  • 如果我们使用 Websocket 并且我们想在控制器中自动装配我们的 SimpMessagingTemplate 怎么办(因为它显然不能在服务类中自动装配 - 现在有这个问题)然后我需要调用控制器从应用程序内部通过 websockets 将 SimpMessagingTemplate 发送到其他地方的方法? - 我曾经通过在应用程序中模拟 REST 调用来做到这一点,现在我想在服务中实现它,但我无法让它工作
猜你喜欢
  • 2011-12-31
  • 2018-09-15
  • 2017-09-07
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 2015-09-17
相关资源
最近更新 更多