Java 选择了错误的rest服务

Java 选择了错误的rest服务,java,rest,cxf,jax-rs,uritemplate,Java,Rest,Cxf,Jax Rs,Uritemplate,我有两种方法: @GET @Path("/{date}") public Response getPartnerInteractionsByDate( @PathParam("partnerId") int partnerId, @PathParam("date") String date ); @GET @Path("/{interactionId}") public Response getPartnerInteraction( @PathP

我有两种方法:

@GET
@Path("/{date}")
public Response getPartnerInteractionsByDate(
        @PathParam("partnerId") int partnerId,
        @PathParam("date") String date
);

@GET
@Path("/{interactionId}")
public Response getPartnerInteraction(
        @PathParam("partnerId") int partnerId,
        @PathParam("interactionId") int interactionId
);
如何选择一项或另一项服务?如果我将interactionId设为“1”,则仍然会执行带有日期的方法。
我使用的是ApacheCXF3.0.1。谢谢

有两个问题。首先,路径必须包含要绑定的PathParams。其次,您的两个路径是相同的,因为它们都采用相同类型的2个参数(cxf无法知道int和包含int的字符串之间的区别)

试着这样做:

@GET
@Path("/{partnerId}/date/{date}")
public Response getPartnerInteractionsByDate(
        @PathParam("partnerId") int partnerId,
        @PathParam("date") String date
);


@GET
@Path("/{partnerId}/{interactionId})
public Response getPartnerInteraction(
        @PathParam("partnerId") int partnerId,
        @PathParam("interactionId") int interactionId
);

问题是,模板表达式的路径不明确。在三个主排序键[1]之后,路径仍然不明确。URI不知道类型。一切都是URI(在URI匹配过程中)是一个字符串。模板表达式值稍后将转换为我们的方法参数类型(如果它是可转换类型[2])

也就是说,消除二者歧义的一种方法是对模板使用正则表达式。比如说

@Path("/{date: \\d{2}-\\d{2}-\\d{4}}")
public Response getPartnerInteractionsByDate

@Path("/{interactionId: \\d{10}}")
public Response getPartnerInteraction
这是假设日期com为
MM-DD-YYYY
格式,交互ID为十位数字。这只是一个示例,但说明了如何使其工作

如果绝对没有可以匹配URI的正则表达式模式,那么您需要更改路径(向其中一个添加一部分)以消除歧义


[1]

  • 排序的主键是完整URI中的文字字符数 匹配模式
  • 排序的次键是嵌入的模板表达式数 在模式内
  • 排序的第三个键是非默认模板表达式的数量。A. 默认模板表达式是不定义正则表达式的表达式
  • [2]

  • 它是一种原始类型。
    int
    short
    float
    double
    byte
    char
    boolean
    类型都属于这一类别
  • 它是一个Java类,具有一个带有单个
    字符串
    参数的构造函数
  • 它是一个Java类,具有名为
    valueOf()
    static
    方法,该方法接受单个
    String
    参数并返回该类的实例
  • 它是一个
    java.util.List
    java.util.Set
    ,或
    java.util.SortedSet
    , 其中,
    T
    是满足条件2或3的类型,或者是
    字符串

  • date
    是否有格式?也许你可以使用正则表达式模式而不仅仅是字符串。请更具体一些。您希望将哪些URL路由到哪些方法?为什么每个path参数有两个,但每个只有一个{}模式?@bmargiles您可以在类级别使用模板表达式(我们不想看到:-)。可能
    {partnerId}
    在类级别
    @Path
    @peeskillet是的partnerId在类'@Path'上第一点不是完全有效的,因为
    {partnerId}
    可以包含在类级别
    @Path
    ;-)是的,很抱歉从代码中漏掉了这一点,partnerId绑定在类级别@Paththank谢谢,我用“/date/”addition重新设计了路径谢谢我忘记了路径中的模式,很好+1.