【发布时间】:2018-10-12 22:16:40
【问题描述】:
我创建了一个 Undertow 服务器和一个处理程序来记录请求。
我在检索HttpServerExchange 的请求正文时遇到问题。
在LoggingHandler 课堂上,我的身体没有问题。但是在TestEndpoint,身体是空的。
如果我删除在LoggingHandler 处检索请求正文的行,则正文将填充到TestEndpoint。
有人知道怎么做吗?
我的服务器类:
package com.undertow.server;
import com.undertow.server.endpoints.TestEndpoint;
import org.jboss.resteasy.plugins.server.undertow.UndertowJaxrsServer;
import org.jboss.resteasy.spi.ResteasyDeployment;
import io.undertow.Undertow;
import io.undertow.Undertow.Builder;
import io.undertow.server.HandlerWrapper;
import io.undertow.server.HttpHandler;
import io.undertow.server.handlers.BlockingHandler;
import io.undertow.servlet.api.DeploymentInfo;
public class UndertowServer {
private UndertowJaxrsServer server;
public UndertowServer() {
this.server = new UndertowJaxrsServer();
}
public void start() {
Builder builder = Undertow.builder().addHttpListener(8000, "0.0.0.0");
this.server.start(builder);
this.configureEndpoints();
}
private void configureEndpoints() {
ResteasyDeployment deployment = new ResteasyDeployment();
deployment.getActualResourceClasses().add(TestEndpoint.class);
DeploymentInfo deploymentInfo = this.server.undertowDeployment(deployment) //
.setClassLoader(ClassLoader.getSystemClassLoader()).setContextPath("/gateway/") //
.setDeploymentName("gateway.war");
deploymentInfo.addInitialHandlerChainWrapper(new HandlerWrapper() {
@Override
public HttpHandler wrap(HttpHandler handler) {
return new BlockingHandler(new LoggingHandler(handler));
}
});
this.server.deploy(deploymentInfo);
}
public static void main(String[] args) {
new UndertowServer().start();
}
}
我的 LoggingHandler 类:
package com.undertow.server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.stream.Collectors;
import org.apache.log4j.Logger;
import io.undertow.server.HttpHandler;
import io.undertow.server.HttpServerExchange;
public class LoggingHandler implements HttpHandler {
private static Logger LOGGER = Logger.getLogger(LoggingHandler.class);
private final HttpHandler next;
public LoggingHandler(final HttpHandler next) {
this.next = next;
}
@Override
public void handleRequest(HttpServerExchange exchange) throws Exception {
LOGGER.info(toString(exchange.getInputStream()).trim());
this.next.handleRequest(exchange);
}
private String toString(InputStream is) throws IOException {
try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) {
return br.lines().collect(Collectors.joining(System.lineSeparator()));
}
}
}
我的 TestEndpoint 类:
package com.undertow.server.endpoints;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.container.AsyncResponse;
import javax.ws.rs.container.Suspended;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.log4j.Logger;
@Path("/person")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class TestEndpoint {
private static Logger LOGGER = Logger.getLogger(TestEndpoint.class);
@POST
@Path("/add")
public void listar(@Suspended AsyncResponse response, String body) {
LOGGER.info(body.trim());
response.resume(Response.ok().build());
}
}
非常感谢!
【问题讨论】:
-
所以你的意思是
String bodyinTestEndointlistar方法是null还是empty? @FDB -
@Vishrant 空字符串
-
我不确定,但
HttpHandler中有请求转发器吗?如果是这样试试。检查handleRequest是否还有其他重载方法,您可以在其中添加标题。 -
尝试调试并查看请求正文的具体设置位置。
-
我在这里分享了我的测试项目......github.com/fabiodelabruna/undertow-server-test
标签: java rest resteasy httphandler undertow