在Service call composition我测试了已记录的示例,它按预期工作了
public ServerServiceCall logged(ServerServiceCall serviceCall) { return HeaderServiceCall.compose(requestHeader -> { System.out.println("Received " + requestHeader.method() + " " + requestHeader.uri()); return serviceCall; }); }
我更改了实现以验证请求标头中的访问令牌,我发现在项目中的多个模块中使用相同的实现而不是复制/粘贴是有用的。 要做到这一点我:
common-tools
的模块configure
方法Descriptor descriptor()
方法
但是我无法编译它,它总是无法编译
这是方法:
@Override default Descriptor descriptor() { Descriptor descriptor = named("security").withCalls( Service.call(this::logged) ).withAutoAcl(true); return descriptor; }
控制台输出:
no suitable method found for call(this::logged) [ERROR] method com.lightbend.lagom.javadsl.api.Service.call(akka.japi.function.Creator>) is not applicable [ERROR] (cannot infer type-variable(s) Request,Response [ERROR] (actual and formal argument lists differ in length)) [ERROR] method com.lightbend.lagom.javadsl.api.Service.call(java.lang.reflect.Method) is not applicable [ERROR] (cannot infer type-variable(s) Request,Response [ERROR] (argument mismatch; java.lang.reflect.Method is not a functional interface)) [ERROR] method com.lightbend.lagom.javadsl.api.Service.call(com.lightbend.lagom.javadsl.api.Descriptor.CallId,java.lang.Object) is not applicable [ERROR] (cannot infer type-variable(s) Request,Response [ERROR] (actual and formal argument lists differ in length))
答案 0 :(得分:1)
定义logged
的方式是另一个服务调用的包装器。但是,在上面的Descriptor
定义中,它没有包含另一个调用。
通常不会将此类型的包装器方法直接添加到描述符中,而是在documentation on service call composition中显示的其他服务调用定义中使用它。
public ServerServiceCall<String, String> sayHello() {
return logged(
name -> completedFuture("Hello " + name)
);
}
这将出现在Descriptor
中,而不引用包装器方法:
@Override
default Descriptor descriptor() {
return named("security").withCalls(
call(this::sayHello)
).withAutoAcl(true);
}
Online Auction Java示例项目中有一个共享模块的示例。 security
子模块由多个服务实现使用。
了解ServerSecurity.authenticated
implemented和used in a service call的方式。