加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Embedded Jetty:选择现有的Spring MVC控制器

发布时间:2020-12-15 03:01:28 所属栏目:Java 来源:网络整理
导读:上下文 我在一个Web应用程序(使用Play Framework)上工作,我正在尝试使用Spring MVC迁移到传统的Servlet模型.我想在已有的Jetty容器(netty)中运行嵌入式Jetty容器. 问题 我正在尝试重新使用创建的Spring上下文(包含所有应用程序bean,包括新添加的Spring MVC控
上下文

我在一个Web应用程序(使用Play Framework)上工作,我正在尝试使用Spring MVC迁移到传统的Servlet模型.我想在已有的Jetty容器(netty)中运行嵌入式Jetty容器.

问题

我正在尝试重新使用创建的Spring上下文(包含所有应用程序bean,包括新添加的Spring MVC控制器),但是请求映射没有被选中.

我调试了Spring的Dispatcher Servlet,并且确实没有注册映射(所以它不能处理任何路径).

试图解决方案

这是手动Jetty设置代码:

@RequiredArgsConstructor
public class EmbeddedJetty {

    private final int port;
    private final AnnotationConfigWebApplicationContext existingContext;

    @SneakyThrows
    public void start() {
        Assert.notNull(existingContext.getBean(UserController.class));

        val server = new Server(port);
        ServletContextHandler handler = new ServletContextHandler();
        ServletHolder servlet = new ServletHolder(new DispatcherServlet(existingContext));
        handler.addServlet(servlet,"/");
        handler.addEventListener(new ContextLoaderListener(existingContext));
        server.setHandler(handler);

        server.start();
        log.info("Server started at port {}",port);
    }

}

而这里的控制器被忽略了:

@Controller
public class UserController {

    @GetMapping("/users/{userId}")
    public ResponseEntity<?> getUser(@PathVariable("userId") long userId) {
        return ResponseEntity.ok("I work");
    }

}

我需要做些什么才能使我的嵌入式jetty设置获取现有的控制器bean并提供映射?

解决方法

静态结构

如果要迁移到servlet模型,您可能希望熟悉正常结构:

.
    ├── pom.xml
    ├── README
    ├── src
    │   ├── main
    │   │   ├── java
    │   │   ├── resources
    │   │   │   ├── spring
    │   │   └── webapp
    │   │       └── WEB-INF
  │ │           └── web.xml
    │   └── test
    │       ├── java
    │       └── resources

web.xml是j2ee服务器用于部署应用程序的核心描述符.在web.xml中定义的应用程序中存在一些重要组件:

>过滤器
> servlet
>听众

Sever Start

当服务器启动时,它将设置监听器以监控整个应用程序或请求的生命周期;它会设置过滤器来过滤请求;它将设置servlet来处理请求.

春天的方式

Spring是一种将许多方便的方法/实用程序集成到我们的应用程序中的轻量级方法.它重量轻,因为它只通过两件事附加到我们的项目中:

>在web.xml中定义spring的侦听器以进行初始化
>将所有请求指向spring(适用于Spring MVC)

建议

所以,回到我们的问题.

>您的jetty服务器以ServletContextHandler开头,它与映射有关,但与侦听器无关(即没有spring config将是init).你应该从WebAppContext开始;
>至少应该添加web.xml来获取现有的控制器bean并提供映射;

参考

> filter and listener
> servletcontexthandler vs webappcontext

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读