使用Micronaut过滤器缺少的东西

时间:2018-08-13 06:33:25

标签: filter documentation micronaut

我正在尝试使用文档第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并未创建或使用过滤器。

很明显,我缺少任何东西。我怀疑我需要做些什么才能使系统接合过滤器。不幸的是,文档仅告诉您如何制作过滤器,而不是如何在微服务中使用它。此外,似乎没有完整的代码示例可以告诉您如何使请求系统利用过滤器(也许我需要向控制器添加注释??)。

有人可以告诉我我在想什么吗?如何使过滤器工作?至少,有人可以提供一个完整的示例,说明如何创建过滤器并将其用于实际的微服务吗?

1 个答案:

答案 0 :(得分:0)

问题解决了。

如果将过滤器和服务文件放在正确的位置,则实际上会很有帮助。当我制作文件并将它们放入测试区域而不是开发区域时,已经太晚了。一旦放置在正确的位置,就可以将过滤器正确注入微服务中。

抱歉,这是您在这里浪费的空间。张贴者可以通过任何方式删除令人尴尬的帖子吗?