Java 在编程配置的Jetty嵌入式服务器中使用HttpRequestHandlerServlet

Java 在编程配置的Jetty嵌入式服务器中使用HttpRequestHandlerServlet,java,spring,jetty,spring-remoting,httpinvoker,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.

我已经通过编程定义了一个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());
    }   
}
import java.io.IOException;
导入java.util.Enumeration;
导入javax.servlet.ServletConfig;
导入javax.servlet.ServletContext;
导入javax.servlet.ServletException;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletRequestWrapper;
导入javax.servlet.http.HttpServletResponse;
导入javax.servlet.http.HttpServletResponseWrapper;
导入org.eclipse.jetty.server.Request;
导入org.eclipse.jetty.server.server;
导入org.eclipse.jetty.servlet.ServletContextHandler;
导入org.eclipse.jetty.servlet.ServletHolder;
导入org.junit.Test;
导入静态org.mockito.mockito.*;
导入org.springframework.context.support.StaticApplicationContext;
导入org.springframework.web.HttpRequestHandler;
导入org.springframework.web.context.WebApplicationContext;
导入org.springframework.web.context.support.GenericWebApplicationContext;
导入org.springframework.web.context.support.HttpRequestHandlerServlet;
公共类TestServer扩展服务器{
public TestServer()引发异常{
超级(8888);
final ServletContextHandler contextHandler=新的ServletContextHandler(此“/”,ServletContextHandler.NO_SESSIONS | ServletContextHandler.NO_SECURITY);
final ServletContext=contextHandler.getServletContext();
StaticApplicationContext applicationContext=新的StaticApplicationContext();
registerSingleton(“testServlet”,TestBean.class);
applicationContext.refresh();
GenericWebApplicationContext webApplicationContext=新的GenericWebApplicationContext();
webApplicationContext.setParent(applicationContext);
webApplicationContext.setServletContext(上下文);
webApplicationContext.refresh();
context.setAttribute(WebApplicationContext.ROOT\u WEB\u APPLICATION\u context\u属性,WebApplicationContext);
ServletConfig ServletConfig=new ServletConfig(){
@凌驾
公共字符串getServletName(){
返回“testServlet”;
}
@凌驾
公共ServletContext getServletContext(){
返回上下文;
}
@凌驾
公共字符串getInitParameter(字符串名称){
返回null;
}
@凌驾
公共枚举getInitParameterNames(){
返回null;
}
};
HttpRequestHandlerServlet HttpRequestHandlerServlet=新的HttpRequestHandlerServlet();
httpRequestHandlerServlet.init(servletConfig);
ServletHolder ServletHolder=新的ServletHolder(httpRequestHandlerServlet);
addServlet(servletHolder,“/testBean”);
start();
}
@试验
public void test()引发异常{
TestServer TestServer=newtestserver();
Request baseRequest=新请求();
HttpServletRequest=mock(HttpServletRequestWrapper.class);
HttpServletResponse=mock(HttpServletResponseWrapper.class);
handle(“/testBean”,baseRequest,request,response);
}
}
类TestBean实现HttpRequestHandler{
@凌驾
public void handleRequest(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
response.getOutputStream().write(“Steve.getBytes());
}   
}
如果运行测试,将发生以下异常(根本原因):

原因:org.springframework.beans.factory.NoSuchBean定义异常:未定义名为“org.springframework.web.context.support.HttpRequestHandlerServlet-406774688”的bean 位于org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:570) 位于org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1108) 位于org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:278) 位于org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198) 位于org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:270) 位于org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198) 位于org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1121) 位于org.springframework.web.context.support.HttpRequestHandlerServlet.init(HttpRequestHandlerServlet.java:58) 位于javax.servlet.GenericServlet.init(GenericServlet.java:241) 位于org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:477)

我使用的是Jetty 7.6.9.v20130131(因为我的真实项目依赖于Camel 2.12.1)和Spring 3.2.4.RELEASE

非常感谢您的帮助

Steve Ardis

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

添加以下代码使我解决了此问题:

servletHolder.setName("testServlet");
史蒂夫·阿迪斯