【问题标题】:How to inject dependency in Servlet in Spring MVC 4?如何在 Spring MVC 4 中的 Servlet 中注入依赖项?
【发布时间】:2018-05-30 14:01:10
【问题描述】:

目前在我的基于 spring mvc 的应用程序中,我也在实现 Servlet(这是一个运行状况检查 servlet)。 我正在尝试使用 @Autowire 注释在这个 servlet 中注入一个类的依赖项,但是这个类没有实例化。

请考虑下面的代码。

@WebServlet(name = "myServlet", urlPatterns = "/app2")
public class HealthCheckController extends HealthCheckServlet{

/** The Constant serialVersionUID. */

    private static final long serialVersionUID = 1L;

    @Autowire
      private MyService service;

    /**
     * method to check healthiness.
     *
     * @return true, if is healthy
     * @throws HealthCheckException the health check exception
     */
    @Override
    public boolean isHealthy() throws HealthCheckException {
        try {
            service.showDetails("12", false,null);
            System.out.println("True");
            return true;
        } catch (Exception  e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return false;
    }

您能否建议我如何提供 MyService 类的依赖项?

提前致谢。

【问题讨论】:

  • 您在哪里提供了 myServlet?在调度程序 servlet 中还是在应用程序上下文中?如果是在disptcher-servlet中,则必须在webservlet中添加@Component,并在disptcher servlet中添加和webservlet的包
  • myServlet 是名称本身
  • 如果您使用 XML,您还应该提供 MyService 类的代码和 beans 配置文件。

标签: java spring spring-mvc dependency-injection


【解决方案1】:

添加 cmets 中提到的“@Controller”并更新您的 URL 映射。另外,什么叫 isHealthy()?尝试在那里添加您的 url 映射。

@Controller
public class HealthCheckController extends HealthCheckServlet{

private static final long serialVersionUID = 1L;

@Autowire
  private MyService service;

@RequestMapping("/app2/*")
public boolean isHealthy() throws HealthCheckException {
    try {
        service.showDetails("12", false,null);
        System.out.println("True");
        return true;
    } catch (Exception  e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

【讨论】:

  • 嗨亚当,这工作正常,但我得到 406 不受支持的媒体类型。我在 isHealthy() 上使用了 MediaType.APPLICATION_JSON。但没有成功。
  • 您的问题是关于依赖注入的。如果还有其他问题,您可能需要对其进行研究,如果您无法找到该新问题的解决方案,则可能会发布另一个问题。
【解决方案2】:

这不是 Spring 托管的 bean。尝试将@Component 添加到类声明中。

@Component
@WebServlet(name = "myServlet", urlPatterns = "/app2")
public class HealthCheckController extends HealthCheckServlet{

您也可以尝试将您的类重构为 Spring 控制器:

@Controller
@RequestMapping("app2")
public class HealthCheckController extends HealthCheckServlet{

您可以尝试的另一件事是在 web.xml 中添加 servlet,而不是使用 @WebServlet 注释。

<servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>mypackage.HealthCheckController</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>/app2</url-pattern>
</servlet-mapping>

【讨论】:

  • 你真的需要使用@WebServlet吗?也许如果你将这个类重构为 @Controller 它应该可以工作。
  • 我的要求是必须实现我的 HealthCheckServlet。现在我是否通过与其他 servlet 或控制器进行扩展来做到这一点并没有影响。
  • HealthCheckServlet 是一个什么样的类?它是实现 HttpServlet 还是别的什么?
  • ,是的,它正在实现 HttpServlet。
  • 我已经编辑了我的答案,您可以尝试其他解决方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
相关资源
最近更新 更多