我正在尝试使用文档第 6.18 节中记录的示例代码在 micronaut 微服务中实现过滤器:
https://docs.micronaut.io/latest/guide/index.html#filters
我有一个 HelloWord 服务,它与文档中提供的服务基本相同,带有一个转到“/hello”的控制器(如文档所述)。我也在使用第 6.18 节中提供的相同 TraceService 和跟踪过滤器。我正在编译和运行服务器没有问题。
不幸的是,当我测试微服务时,过滤器没有被使用。
我很确定我的代码中缺少某些东西,但正如我所说,我使用的是与示例中相同的代码:
TraceService Class
import io.micronaut.http.HttpRequest;
import io.reactivex.Flowable;
import io.reactivex.schedulers.Schedulers;
import org.slf4j.*;
import javax.inject.Singleton;
@Singleton
public class TraceService {
private static final Logger LOG = LoggerFactory.getLogger(TraceService.class);
Flowable<Boolean> trace(HttpRequest<?> request) {
System.out.println("TRACE ENGAGED!");
return Flowable.fromCallable(() -> {
if (LOG.isDebugEnabled()) {
LOG.debug("Tracing request: " + request.getUri());
}
// trace logic here, potentially performing I/O
return true;
}).subscribeOn(Schedulers.io());
}
}
Trace Filter
import io.micronaut.http.*;
import io.micronaut.http.annotation.Filter;
import io.micronaut.http.filter.*;
import org.reactivestreams.Publisher;
@Filter("/hello/**")
public class TraceFilter implements HttpServerFilter {
private final TraceService traceService;
public TraceFilter(TraceService traceService) {
System.out.println("Filter created!");
this.traceService = traceService;
}
@Override
public Publisher<MutableHttpResponse<?>> doFilter(HttpRequest<?> request, ServerFilterChain chain) {
System.out.println("Filter engaged!");
return traceService.trace(request)
.switchMap(aBoolean -> chain.proceed(request))
.doOnNext(res -> res.getHeaders().add("X-Trace-Enabled", "true")
);
}
}
The Controller
import io.micronaut.http.annotation.*;
@Controller("/hello")
public class HelloController {
@Get("/")
public String index() {
return "Hello World";
}
}
请注意,控制器使用文档第 2.2 节中的代码:
https://docs.micronaut.io/latest/guide/index.html#creatingServer
我做了很多事情来尝试查看过滤器发生了什么,包括在服务和过滤器的战略部分中放置少量打印输出。这些打印输出没有打印出来,这告诉我 Micronaut 没有创建或使用过滤器。
显然我错过了一些东西。我怀疑我需要做一些事情才能让系统使用过滤器。不幸的是,文档只讲述了如何制作过滤器,而不是如何在微服务中使用它。此外,似乎没有任何完整的代码示例说明如何使请求系统利用过滤器(也许我需要将注释添加到控制器中???)。
有人能告诉我我错过了什么吗?如何让过滤器工作?至少,有人能提供一个完整的例子来说明如何创建过滤器并在实际的微服务中使用它吗?