Hi! I'm trying without success to create a "filter" or "interceptor" or something that make me able to catch every request, read the cookie and set MDC key-value for logging purposes. And when the request has finish, clear those keys, in order not to leave zombie MDC values on that thread.
I found a few examples in the web, but none of them works in this play version (2.2.x for Java).
But this filter only do something when the request arrives, but not when the request is leaving...
import play.api.mvc.*;
import scala.Function1;
import scala.concurrent.Future;
import scala.runtime.AbstractFunction1;
public abstract class JavaFilter implements Filter {
@Override
public Future<SimpleResult> apply(Function1<RequestHeader, Future<SimpleResult>> nextFilter, RequestHeader requestHeader) {
return nextFilter
.apply(requestHeader)
.map(new AbstractFunction1<SimpleResult, SimpleResult>() {
@Override
public SimpleResult apply(SimpleResult currentResult) {
return Apply(currentResult, requestHeader);
}
},
play.api.libs.concurrent.Execution.defaultContext());
}
@Override
public EssentialAction apply(EssentialAction next) {
return Filter$class.apply(this, next);
}
public abstract SimpleResult Apply(SimpleResult currentResult, RequestHeader requestHeader);
}
LoggerMdcFilter.javaimport org.jboss.logging.MDC;
import play.api.mvc.RequestHeader;
import play.api.mvc.SimpleResult;
public class LoggerMdcFilter extends JavaFilter {
@Override
public SimpleResult Apply(SimpleResult currentResult, RequestHeader requestHeader) {
MDC.put("email", requestHeader.session().get("email").get());
return currentResult;
//TODO: Clean MDC when request ends
}
}
Can anyone share a working example of setting and clear an MDC on play 2.2.x for Java?
Or at least tell me if the given example can be improve in order to clean the MDC when the request leaves the server?
Thanks in advance!
Diego