Lagom - 如何使用查询参数(类型数组中的哪一个)将端点映射到restcall

问题描述 投票:1回答:1
Sample endpoint : http://localhost:9003/mas/v1/events?ids=["e1","e2","e3"]

我正在尝试将查询参数映射到string [],下面是服务调用和restcall映射完成

 //Mapping the query parameter to array of string
 ServiceCall<NotUsed, String> getEvents(String[] ids);

 restCall(Method.GET, "/mas/v1/events?ids", this::getEvents);

当我尝试将查询参数映射到String []时,我得到以下异常

Caused by: java.lang.IllegalStateException: Unable to resolve method for service call with ID RestCallId{method=GET, pathPattern='/mas/v1/events?ids'}. Ensure that the you have passed a method reference (ie, this::someMethod). Passing anything else, for example lambdas, anonymous classes or actual implementation classes, is forbidden in declaring a service descriptor.
    at com.lightbend.lagom.internal.javadsl.api.ServiceReader$$anonfun$4.apply(ServiceReader.scala:103)
    at com.lightbend.lagom.internal.javadsl.api.ServiceReader$$anonfun$4.apply(ServiceReader.scala:88)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
    at scala.collection.Iterator$class.foreach(Iterator.scala:893)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1336)
    at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
    at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
    at scala.collection.AbstractTraversable.map(Traversable.scala:104)
    at com.lightbend.lagom.internal.javadsl.api.ServiceReader$.resolveServiceDescriptor(ServiceReader.scala:88)
    at com.lightbend.lagom.internal.javadsl.server.JavadslServerBuilder.resolveDescriptor(JavadslServerBuilder.scala:66)
    at com.lightbend.lagom.internal.javadsl.server.JavadslServerBuilder$$anonfun$1.apply(JavadslServerBuilder.scala:55)
    at com.lightbend.lagom.internal.javadsl.server.JavadslServerBuilder$$anonfun$1.apply(JavadslServerBuilder.scala:49)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
    at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
    at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
    at scala.collection.AbstractTraversable.map(Traversable.scala:104)
    at com.lightbend.lagom.internal.javadsl.server.JavadslServerBuilder.resolveServices(JavadslServerBuilder.scala:49)
    at 
Caused by: java.lang.ClassNotFoundException: [Ljava/lang/String
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at com.lightbend.lagom.internal.javadsl.api.MethodRefResolver$.loadClass(MethodRefResolver.scala:58)
    at com.lightbend.lagom.internal.javadsl.api.MethodRefResolver$.parseArgumentClasses$1(MethodRefResolver.scala:73)
    at com.lightbend.lagom.internal.javadsl.api.MethodRefResolver$.getArgumentClasses(MethodRefResolver.scala:95)
    at com.lightbend.lagom.internal.javadsl.api.MethodRefResolver$.resolveMethodRef(MethodRefResolver.scala:49)
    at com.lightbend.lagom.internal.javadsl.api.ServiceReader$$anonfun$4.apply(ServiceReader.scala:100)
    ... 66 more
java query-parameters lagom
1个回答
0
投票

你可以简单地将ids参数设为String

因此,您的服务呼叫和休息呼叫映射将如下所示。

 ServiceCall<NotUsed, String> getEvents(String ids);

 restCall(Method.GET, "/mas/v1/events?ids", this::getEvents);

因此,您的示例端点将如下所示。

Sample endpoint : http://localhost:9003/mas/v1/events?ids=e1,e2,e3

然后使用String.split(regex)方法将String Ids转换为服务调用实现方法中的数组。

@Override
public ServiceCall<NotUsed, String> getEvents(String ids) {
    String[] idsArray = ids.split(",");
    return request -> CompletableFuture.completedFuture("");
}
© www.soinside.com 2019 - 2024. All rights reserved.