在Service call composition中,我测试了记录的示例,它按预期工作
公开的ServerServiceCall记录(ServerServiceCall serviceCall){
return HeaderServiceCall.compose(requestHeader-> {
System.out.println(“ Received” + requestHeader.method()+“” + requestHeader.uri());
返回serviceCall;
});
}
我更改了实现以验证请求标头中的访问令牌,发现在项目的多个模块中使用相同的实现来代替复制/粘贴很有用。
为此,我:
在我的项目中创建了一个名为common-tools
的模块
创建了一个名为AuthorizationService的服务及其实现
创建了CommunModule类并覆盖了configure
方法
试图覆盖Descriptor descriptor()
方法
但我无法将其编译,但始终无法编译
这是方法:
@Override
默认的Descriptor descriptor(){
描述符描述符= named(“ security”)。withCalls(
Service.call(this :: logged)
).withAutoAcl(true);
返回描述符;
}
控制台输出:
找不到适合调用的方法(this :: logged)
[错误]方法com.lightbend.lagom.javadsl.api.Service.call(akka.japi.function.Creator>)不适用
[错误](无法推断类型变量的请求,响应
[错误](实际和正式参数列表的长度不同)
[错误]方法com.lightbend.lagom.javadsl.api.Service.call(java.lang.reflect.Method)不适用
[错误](无法推断类型变量的请求,响应
[错误](参数不匹配; java.lang.reflect.Method不是功能接口))
[错误]方法com.lightbend.lagom.javadsl.api.Service.call(com.lightbend.lagom.javadsl.api.Descriptor.CallId,java.lang.Object)不适用
[错误](无法推断类型变量的请求,响应
[错误](实际和正式参数列表的长度不同)
最佳答案
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的方式。关于java - 对同一项目中的多个模块使用/公开服务调用组合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48192551/