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.authenticatedimplementedused in a service call的方式。

关于java - 对同一项目中的多个模块使用/公开服务调用组合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48192551/

10-12 00:36