1

我有两种方法的资源:

@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
);

如何选择一项或另一项服务?如果我将“1”作为interactionId,仍然会执行带有日期的方法。我正在使用 apache cxf 3.0.1。谢谢

4

2 回答 2

2

问题是,您的模板表达式的路径不明确。在三个主要的排序键[ 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 ]

  1. 排序的主键是完整 URI 匹配模式中的文字字符数。
  2. 排序的次键是嵌入在模式中的模板表达式的数量
  3. 排序的第三个键是非默认模板表达式的数量。默认模板表达式是没有定义正则表达式的模板表达式

[ 2 ]

  1. 它是一种原始类型。, int, short, float, double, byte,charboolean类型都属于这一类。
  2. 它是一个具有单个String参数的构造函数的 Java 类。
  3. 它是一个 Java 类,有一个static名为的方法,该方法valueOf()接受一个String参数并返回该类的一个实例。
  4. 它是 a java.util.List<T>java.util.Set<T>java.util.SortedSet<T>, 其中T是满足条件 2 或 3 的类型或者是 a String
于 2014-11-12T02:18:11.310 回答
1

有两个问题。首先是您的 Path 必须包含您要绑定的 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
);
于 2014-11-12T02:12:17.487 回答