当前位置: 首页 > 知识库问答 >
问题:

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

黄俊智
2023-03-14

在服务调用组合中,我测试了已记录的示例,它按预期工作

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

我更改了实现以验证请求头中的访问令牌,我发现在项目的多个模块中使用相同的实现而不是复制/粘贴非常有用。为此,我:

  • 在我的项目中创建了一个名为公共工具的模块
  • 创建了一个名为AuthorizationService的服务及其实现
  • 创建了一个通信模块类并重写了配置方法
  • 尝试覆盖描述符描述符()方法,但我无法使其编译,它总是编译失败这就是方法:
    @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个答案

刘选
2023-03-14

定义log的方式是作为另一个服务调用的包装。但是,在上面的描述符定义中,它不是包装另一个调用。

您通常不会将这种类型的包装器方法直接添加到描述符中,而是在其他服务调用定义中使用它,如关于服务调用组合的文档所示。

public ServerServiceCall<String, String> sayHello() {
  return logged(
      name -> completedFuture("Hello " + name)
  );
}

这将出现在描述符中,而不引用包装器方法:

@Override
default Descriptor descriptor() {
    return named("security").withCalls(
            call(this::sayHello)
    ).withAutoAcl(true);
}

在线拍卖项目中有一个共享模块Java示例。安全子模块由几个服务实现使用。

看看ServerSecurity是如何实现的。已验证的在服务调用中实现和使用。

 类似资料:
  • 我在一个基于OpenStack的私有云上有一个Kubernetes集群。需要在特定端口上公开我的服务。我可以使用Nodeport来完成此操作。但是,如果我尝试创建与第一个类似的另一个服务,我将无法公开它,因为我必须使用相同的端口,并且它已经被第一个服务占用了。 我注意到我可以在公共云中使用LoadBalancer,但我假设这在OpenStack中是不可能的?我也尝试使用Kubernetes的Ing

  • MyApp和MyAppCore有自己的AppComponent,MyApp提供ViewModel工厂,MyAppCore提供数据库和网络访问工厂(下面的示例)。 我不确定如何链接AppComponent(或应用程序),以便在MyApp中提供数据库和网络访问。以下是我目前掌握的信息: MyAppCore模块 MyAppCore还具有名为的Room数据库实现和接口(我认为我不需要在这个问题中添加此代码

  • 问题内容: 我正在将一些后端转换为模块,并在设置开发环境配置时感到困惑。我在Eclipse中使用Java,但未在Maven中使用Java。架构非常简单: 前端模块为默认模块。基本的GAE / GWT应用程序。将项目放入任务队列。 后端模块处理任务队列。 使用旧的后端体系结构,一个调试配置将启动开发服务器,该服务器将为GWT DevMode UI 和 后端任务处理提供服务。 问题的症结在于DevMo

  • 我正在寻找一个与多个OidcClients进行多个服务调用的quarkus反应项目样本? 例如:DemoProject希望调用服务A、B、C、D。DemoProject使用了以grant类型作为密码的keycloak授权。服务A有OidcClientA,服务B有OidcClientB,服务C有OidcClientC,服务D有Oidcclientd。我们如何简单地将OidcClient注入到特定的服

  • 主要内容:1- 介绍,2- 示例模型,3-创建项目数学库,4- 创建另一个项目:MathWebApp,5- 创建GradleMain项目,6- 构建项目,7- 运行MathWebApp1- 介绍 本教程文章基于: Eclipse Java EE IDE for Web Developers. Version: Mars.1 Release (4.5.1) 如果您是初学者Gradle的。那么建议先看看初学者Gradle(Gradle Hello world)的文章: http://www.yiib

  • 我正在使用Enunciate为多模块Maven项目中的RestEasy服务生成文档。在试图获取响应对象属性的描述时,我在文档生成方面遇到了一些问题。 例如,如果我的服务定义为: 当生成留档时,不生成属性描述。 在我只得到的所有响应对象中(未提供文档)。一个重要的想法是,所有响应类都位于服务所在的不同 Maven 模块中。响应类位于 UTIL 模块中。这些服务位于 EJB 模块中。 问题的原因肯定是