0

アプリケーションをテストするために使用している Java HttpHandler があります。HttpHandler では、各 http 要求が個別のスレッドで処理され、HttpExchange に渡されます。しかし、現在実行中のテストに対して HttpHandler が正しい応答を返すことができるように、メイン スレッドとクラス (HttpServer と 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
    }
4

1 に答える 1

2

コメントから、ハンドラーを自分で構築していると言っています。オブジェクトをハンドラーに挿入する一般的な方法は、オブジェクトを引数としてコンストラクターに渡すことです。

例えば:

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 属性と区別するために、 で始まる属性名を使用することをお勧めします。

于 2012-07-25T18:30:32.617 に答える