当前位置: 首页 > 知识库问答 >
问题:

在Vaadin 23-Spring 2.7.1中添加单独的自定义Servlet

欧阳嘉年
2023-03-14

这个问题已经被问过了,但从那时起,所有的答案(我能找到)都不再有效。

本质上,我想用Vaadin(V23)实现一个网站,该网站通过另一台服务器(物理)上运行的POST请求与WebApp进行通信。为此,我想创建单独的Servlet来处理与另一台服务器的通信(接收方)。比如说,这不是嵌入式版本:

@WebServlet(urlPatterns = "/communication", name = "QuizServlet", asyncSupported = true)
public class QuizServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.sendError(400, "Not implemented");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.sendError(400, "Not implemented");
    }
}

然而,问题是,无论我做什么,我总是被重定向到默认的dispatcher Servlet:

>

  • SpringVaadinServlet已弃用,不再存在,扩展VaadinServlet不起作用。

    更改属性中的映射(vaadin.url-映射=)也不起作用,我只是在所有情况下都被重定向到这个新映射。

    尝试在单独的端口上执行Servlet会在所有端口上产生相同的重定向,即使在连接器上显式注册我的自定义Servlet,也会使用单独的服务(webmvcconfiguerTomcat配置)。这个帖子的答案,也太老了。

    直接注册servlet也不会做任何事情(通过实现WebApplicationInitializer)。

    有一个问题是,如何在新的Vaadin 23和Spring Boot 2.7.1中使用两个不同的servlet?


  • 共有1个答案

    后化
    2023-03-14

    我找到了解决我问题的办法。也就是说,在启动bootapplication时,我还启动了使用自定义Servlet的第二个单独的Tomcat服务器:

    @Service
    public class QuizServer {
    
        private final Log log = LogFactory.getLog(QuizServer.class);
    
        @PostConstruct
        public void startServer() throws IOException, LifecycleException {
            start();
        }
    
        private void start() throws IOException, LifecycleException {
            Tomcat tomcat = new Tomcat();
            String contextPath = "/";
            String appBase = new File(".").getAbsolutePath();
    
            Context ctx = tomcat.addContext(contextPath, appBase);
            Tomcat.addServlet(ctx, "quizServlet", new QuizServlet());
            ctx.addServletMappingDecoded("/*", "quizServlet");
    
            tomcat.setPort(8085);
            tomcat.start();
            tomcat.getConnector();
            log.info("Quiz server started");
        }
    }
    
    @WebServlet(urlPatterns = "/*", name = "quizServlet", asyncSupported = true)
    public class QuizServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.getWriter().println("Test");
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.sendError(400, "Not implemented");
        }
    }
    

    不过,它有点粗糙,因为理想情况下,它不应该需要单独的服务器。

     类似资料:
    • 我有一个正在构建的搜索结果页面,它将帖子分为三个类别(产品、食谱、文章),在页面的下面三个单独的部分。类别(菜谱和文章)很好,也很简单——创建一个查询以在两个单独的循环中使用,但是我在自定义帖子类型方面遇到了问题。 如果可能的话,我想在循环中引入这些,但不确定是在post类型上还是在分类法上这样做。很明显,这些产品在分类法下被划分为子类别,所以当我尝试它时,它多次拉同一个产品。 现在,我已经放弃了

    • 我已经搜索了又搜索,除了我称之为“hack方法”的方法之外,找不到其他方法将自定义分类添加到自定义管理菜单中。 然后我注册我的帖子类型并确保它们使用 这可以工作,自定义帖子类型显示在我的自定义菜单中。 但是自定义分类法不接受同一属性的字符串,只接受true或false。 因此,要添加它,您必须创建一个子菜单页 这是一种“黑客”方式。 还有别的办法吗?如果不修改WordPress核心,我可以覆盖re

    • 控制器名称:Controller1,自定义标头:Header1 应为特定控制器下的所有 API 显示标头

    • 我有一个WordPress菜单,其中有一些菜单项是我通过标准(拖放)WordPress管理菜单功能添加的。最近,我不得不在菜单中添加另一项,以生成动态href链接。我在函数中使用以下代码实现了这一点。php文件: //将“我的个人资料”菜单项动态添加到“成员”菜单(根据当前登录的用户生成用户名) add_filter(wp_nav_menu_items、add_profilelink_in_men

    • 问题内容: 我想制作一个简单的表,其中包含一行自定义按钮。当按下按钮时,我想弹出一个“警告”框。我已经阅读了一些关于此的文章,我不明白为什么我的代码无法正常工作。绘制了按钮,但按下按钮无效。 我在这里描述了三种尝试。 版本1。单击按钮不会触发: HTML代码: 编辑8/2/12-自从我的原始文章以来,我已经学到了一些东西,在这里我描述了另外两次尝试。 版本2:我使用onCellSelect。这行得

    • 应用可以通过manage.py注册它们自己的动作。例如,你可能想为你正在发布的Django应用添加一个manage.py动作。在本页文档中,我们将为教程中的 polls应用构建一个自定义的 closepoll命令。 要做到这点,只需向该应用添加一个management/commands目录。Django将为该目录中名字没有以下划线开始的每个Python模块注册一个manage.py命令。例如: p