我有一个用于测试应用程序的Java HttpHandler。在HttpHandler中,每个http请求都在单独的线程中处理,并传递给HttpExchange。但是我需要从主线程和类(用于设置HttpServer和HttpHandler的类)访问数据,以便HttpHandler可以为正在运行的当前测试发送回正确的响应。如何获得通过HttpHandler类传递或访问的数据的最佳方法?我不能向HttpHandler#handle添加另一个参数,因为该参数由HttpHandler定义并由HttpServer使用,并且我无法在主类中访问任何静态方法。我还需要将消息从HttpHandler推回到主类进行记录。

谢谢

我的代码示例:

class RequestHandler implements HttpHandler {

    @Override
    public void handle(HttpExchange exchange)
     {
        // do a bunch of stuff with the request that come in.
    }
}


public class MainClass
{
    public static void main(String[] args)
    {
        HttpServer server;
        ExecutorService excutor;
        InetSocketAddress addr = new InetSocketAddress(ipAdd, ipPort);
        server = HttpServer.create(addr, 0);
        server.createContext("/", new RequestHandler());
        excutor = Executors.newCachedThreadPool();
        server.setExecutor(excutor);
        server.start();
       // do a bunch of stuff that uses the server
    }

最佳答案

从评论中可以看出,您是在自己构造处理程序。您可以将对象注入处理程序中的一种典型方法是将它们作为参数传递给构造函数。

例如:

public class RequestHandler implements HttpHandler {

    private final Object someObject;

    public RequestHandler(Object someObject) {
        // there is an implied super() here
        this.someObject = someObject;
    }

    public void handle(HttpExchange exchange) throws IOException {
       ...
       // you can then use someObject here
       ...
    }
}


然后可以将对象传递到处理程序中,如下所示:

server.createContext("/", new RequestHandler(someObject));


就在处理程序之间传递信息而言,您应该能够使用HttpExchange.setAttribute(...)方法执行此操作。那是典型的方式。我建议使用以"_"开头的属性名称,以将其与HTTP属性区分开。

10-04 12:20