java - 在以编程方式配置 Jetty 嵌入式服务器中使用 HttpRequestHandler Servlet

标签 java spring jetty spring-remoting httpinvoker

我以编程方式定义了一个 Jetty 服务器并添加了一个 HttpRequestHandlerServlet 的实例。我试图在没有 web.xml 文件的情况下完成所有这一切。这是我的代码的简化版本:

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.junit.Test;

import static org.mockito.Mockito.*;

import org.springframework.context.support.StaticApplicationContext;
import org.springframework.web.HttpRequestHandler;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.GenericWebApplicationContext;
import org.springframework.web.context.support.HttpRequestHandlerServlet;

public class TestServer extends Server {

    public TestServer() throws Exception {      
        super(8888);

        final ServletContextHandler contextHandler = new ServletContextHandler(this, "/", ServletContextHandler.NO_SESSIONS|ServletContextHandler.NO_SECURITY);
        final ServletContext context = contextHandler.getServletContext();

        StaticApplicationContext applicationContext = new StaticApplicationContext();
        applicationContext.registerSingleton("testServlet", TestBean.class);
        applicationContext.refresh();

        GenericWebApplicationContext webApplicationContext = new GenericWebApplicationContext();
        webApplicationContext.setParent(applicationContext);
        webApplicationContext.setServletContext(context);
        webApplicationContext.refresh();

        context.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, webApplicationContext);

        ServletConfig servletConfig = new ServletConfig() {

            @Override
            public String getServletName() {                
                return "testServlet";
            }

            @Override
            public ServletContext getServletContext() {
                return context;
            }

            @Override
            public String getInitParameter(String name) {
                return null;
            }

            @Override
            public Enumeration<String> getInitParameterNames() {
                return null;
            }
        };

        HttpRequestHandlerServlet httpRequestHandlerServlet = new HttpRequestHandlerServlet();
        httpRequestHandlerServlet.init(servletConfig);

        ServletHolder servletHolder = new ServletHolder(httpRequestHandlerServlet);

        contextHandler.addServlet(servletHolder, "/testBean");

        start();
    }

    @Test
    public void test() throws Exception {
        TestServer testServer = new TestServer();

        Request baseRequest = new Request();
        HttpServletRequest request = mock(HttpServletRequestWrapper.class);
        HttpServletResponse response = mock(HttpServletResponseWrapper.class);

        testServer.handle("/testBean", baseRequest, request, response);     
    }
}

class TestBean implements HttpRequestHandler {

    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getOutputStream().write("Steve".getBytes());
    }   
}

如果运行测试,则会出现以下异常(根本原因):

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.springframework.web.context.support.HttpRequestHandlerServlet-406774688' is defined at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:570) at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1108) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:278) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:270) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1121) at org.springframework.web.context.support.HttpRequestHandlerServlet.init(HttpRequestHandlerServlet.java:58) at javax.servlet.GenericServlet.init(GenericServlet.java:241) at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:477)

我正在使用 Jetty 7.6.9.v20130131(由于我的实际项目依赖于 Camel 2.12.1)和 Spring 3.2.4.RELEASE。

非常感谢任何帮助。

史蒂夫·阿迪斯

最佳答案

我知道“目标 bean 名称必须与 web.xml 中定义的 HttpRequestHandlerServlet servlet 名称匹配”(请参阅​​ HttpRequestHandlerServlet 上的 JavaDoc),但我只做了使用编程方法时所需的一半。

添加以下代码让我解决了这个问题:

servletHolder.setName("testServlet");

史蒂夫·阿迪斯

关于java - 在以编程方式配置 Jetty 嵌入式服务器中使用 HttpRequestHandler Servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20810058/

相关文章:

java - 如何在PreparedStatement中使用自动生成的@Id?

jetty :如何更改启动临时目录

java - 将选择的文件上传到目录

java - 将 kotlin 谓词转换为 java

java - 让 Android 查找 Date 并计算此时与现在之间的天数

java - 如何在 Eclipse 中导入 jar?

java - web.xml 中的 taglib 配置

java - Spring MVC REST 映射在 postman 中返回错误 404

sql-server - 带有 SQL Server 2017 数据源的 Jetty

solr - Jetty 日志位置