首页 文章

使用/公开服务调用合成到同一项目中的多个模块

提问于
浏览
1

Service call composition中,我测试了记录的示例,它按预期工作

public  ServerServiceCall logged(ServerServiceCall serviceCall) {
        return HeaderServiceCall.compose(requestHeader -> {
            System.out.println("Received " + requestHeader.method() + " " + requestHeader.uri());
            return serviceCall;
        });
    }

我更改了实现以验证请求标头中的访问令牌,我发现在我的项目中使用多个模块中的相同实现而不是复制/粘贴是有用的 . 要做到这一点我:

  • 在我的项目中创建了一个名为 common-tools 的模块

  • 创建了一个名为AuthorizationService的服务及其实现

  • 创建了一个CommunModule类并覆盖了 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))

1 回答

  • 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 是如何implementedused in a service call .

相关问题