Да, это возможно, но требует обходного решения.
Вы можете добавить этот блок use
в качестве первой строки в вашем приложении. Это позволяет вам получить доступ к телу несколько раз через request.body()
. Внутренне тело будет перетекать в память и выгружаться на диск, если оно слишком велико во всех случаях, этот обходной путь просто гарантирует, что вы каждый раз получаете одну и ту же ссылку.
// Cache body in request scope
use("*", "*", (req, res, chain) -> {
final Mutant body = req.method().equalsIgnoreCase("post") ? req.body() : null;
Request.Forwarding wrappedReq = new Request.Forwarding(req) {
@Override
public Mutant body() throws Exception {
if(body != null) {
return body;
}
return super.body();
}
@Override
public <T> T body(Class<T> type) throws Exception {
return body().to(type);
}
};
chain.next(wrappedReq, res);
});
Любой фильтр или маршрут, определенные после этого блока, смогут получить тело запроса несколько раз. Если тело было запрошено уже до этого блока use
, оно не будет работать.