У меня есть java HttpHandler, который я использую для тестирования приложения. В HttpHandler каждый HTTP-запрос обрабатывается в отдельном потоке и передается HttpExchange. Но мне нужно получить доступ к данным из основного потока и класса (того, который настраивает HttpServer и HttpHandler), чтобы HttpHandler мог отправить правильный ответ для текущего выполняемого теста. Как лучше всего передать эти данные в класс HttpHandler или сделать их доступными для него? Я не могу добавить еще один параметр в дескриптор HttpHandler #, поскольку он определяется 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
}
1 ответ
Из комментариев вы говорите, что сами конструируете обработчики. Типичный способ внедрения объектов в обработчики - просто передать их в качестве аргументов конструктору.
Например:
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.
RequestHandler
ваш класс? Тогда да. Можно сказать: server.createContext("/", new RequestHandler(someObject));
.
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.