【问题标题】:How can I tell if Spring has loaded my @Controller?如何判断 Spring 是否加载了我的 @Controller?
【发布时间】:2014-07-30 01:41:26
【问题描述】:

有没有办法判断 Spring 是否加载了我的 @Controller

我正在请求一个 URL,但我没有点击我的控制器,我不知道为什么

我正在通过组件扫描加载控制器

<context:component-scan base-package="com.example.app.web"/>

与我的故障控制器同一个包中的其他控制器工作正常。

我的控制器代码是:

@Controller
@RequestMapping(value = "/app/administration/ecosystem")
public class AppEcosystemController {

    @Autowired
    EcosystemManagerService ecosystemManagerService;

    @RequestMapping(value = "/Foo", method = RequestMethod.GET)
    public String getEcosystem() {
        /* Implementation */
    }

我想做的第一件事是确保这个控制器被组件扫描拾取。

有什么建议吗?

【问题讨论】:

  • 您确定您的组件在应用程序上下文中被正确扫描/注册了吗?这个问题是只发生在这个控制器上还是其他人身上?
  • 就这一个控制器;包裹中的所有其他人都被取走
  • 通过告诉 IntelliJ 清理和重建解决了加载问题... 耸耸肩

标签: spring spring-mvc


【解决方案1】:

只需为您的应用程序启用日志记录,您可以在 INFO 级别找到此信息
例如,在我的应用程序中,我有一个名为 UserController 的控制器。

以下 log4j.properties 可以解决问题。

log4j.rootLogger=INFO, FILE
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=../logs/rest-json.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

我可以在日志中看到 RequestMappingHandlerMapping 映射了我的控制器(一直向右滚动)。

07:28:36,255  INFO RequestMappingHandlerMapping:182 - Mapped "{[/rest/**/users/{id}],methods=[GET],params=[],headers=[],consumes=[],produces=[text/xml || application/json],custom=[]}" onto public org..domain.User org.ramanh.controller.UserController.getUser(java.lang.String)
07:28:36,255  INFO RequestMappingHandlerMapping:182 - Mapped "{[/rest/**/users],methods=[POST],params=[],headers=[],consumes=[],produces=[text/xml || application/json],custom=[]}" onto public void org..controller.UserController.addUser(org...domain.User)

如果您仍然不确定,我建议您添加一个带有 @PostConstruct 注释的方法。 您可以轻松地在日志中查找消息或在此方法中设置断点。

@PostConstruct
protected void iamAlive(){
    log.info(“Hello AppEcosystemController”)
}

如果您发现您的控制器已正确初始化但仍然无法访问 url。我将测试以下内容

  1. 您收到 404 错误 - 也许您没有指向正确的 url(不要忘记将应用程序作为前缀添加到 url)
  2. 您收到 404 错误 - web.xml 中的调度程序 servlet 映射不满足 上面的网址
  3. 您得到的是 403/401 – 也许您正在使用 弹簧安全,它阻止了网址
  4. 你得到 406 - 你的 内容类型定义与您的请求冲突
  5. 您获得了 50 倍 - 您的代码中有问题

【讨论】:

    【解决方案2】:

    我做了一个ApplicationContextDumper。将其添加到应用程序上下文中,当应用程序上下文初始化完成时,它会将当前上下文和父上下文(如果有)中的所有 bean 及其依赖项转储到日志文件中。它还列出了未引用的 bean。

    灵感来自answer

    【讨论】:

      【解决方案3】:

      您可以按照here 的概述为 Spring 启用调试日志记录。

      我还建议利用 MVC 测试支持,您可以在 spring-test jar 中找到它。详细使用方法请见herehere

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-12
        • 2013-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-13
        • 2012-05-19
        相关资源
        最近更新 更多