Apache-CXF JAX-RS 实现不遵守正确的@Path 顺序
Apache-CXF JAX-RS implementation not respecting proper @Path ordering
我有一个 JAX-RS 网络服务,如下所示:
@Path("/service")
public interface Service {
@GET
@Path("/{serviceId}")
public Response getService(@PathParam("serviceId") String serviceId);
@GET
@Path("/{serviceId}/private")
public Response getPrivateService(@PathParam("serviceId") String serviceId);
@GET
@Path("/other-thing")
public Response getOtherThing(@CookieParam("cookieName") String cookieValue);
}
出于某种原因,GET /other-thing
总是使用 @Path("/{serviceId}")
调用第一个方法。调用 GET /abc/private
returns 404 声称没有匹配的路由。根据规范,应选择具有最匹配文字字符的路径,但似乎我的路线被完全忽略了。我该如何调试?
这是来自 CXF 的日志消息:
No operation matching request path "/service/abc/private" is found, Relative Path: /abc/private, HTTP Method: GET, ContentType: */*, Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,. Please enable FINE/TRACE log level for more details.
我发现了问题。
我最近从 Eclipse 切换到 IntelliJ。 Eclipse 的默认行为是在自动生成接口方法实现时忽略任何注释。另一方面,IntelliJ 保留注释。这是不同的:
// In Eclipse
public class ServiceImplementation implements Service {
public Response getService(String serviceId) {
return null;
}
}
// In IntelliJ
public class ServiceImplementation implements Service {
// Note the @PathParam
public Response getService(@PathParam("serviceId") String serviceId) {
return null;
}
}
服务实现中的附加注解导致路径解析失败。由于我在 Eclipse 中实现了 getService
,它工作正常,但是在我删除服务实现中的参数注释之前,实现的 IntelliJ 的新方法不起作用。
我有一个 JAX-RS 网络服务,如下所示:
@Path("/service")
public interface Service {
@GET
@Path("/{serviceId}")
public Response getService(@PathParam("serviceId") String serviceId);
@GET
@Path("/{serviceId}/private")
public Response getPrivateService(@PathParam("serviceId") String serviceId);
@GET
@Path("/other-thing")
public Response getOtherThing(@CookieParam("cookieName") String cookieValue);
}
出于某种原因,GET /other-thing
总是使用 @Path("/{serviceId}")
调用第一个方法。调用 GET /abc/private
returns 404 声称没有匹配的路由。根据规范,应选择具有最匹配文字字符的路径,但似乎我的路线被完全忽略了。我该如何调试?
这是来自 CXF 的日志消息:
No operation matching request path "/service/abc/private" is found, Relative Path: /abc/private, HTTP Method: GET, ContentType: */*, Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,. Please enable FINE/TRACE log level for more details.
我发现了问题。
我最近从 Eclipse 切换到 IntelliJ。 Eclipse 的默认行为是在自动生成接口方法实现时忽略任何注释。另一方面,IntelliJ 保留注释。这是不同的:
// In Eclipse
public class ServiceImplementation implements Service {
public Response getService(String serviceId) {
return null;
}
}
// In IntelliJ
public class ServiceImplementation implements Service {
// Note the @PathParam
public Response getService(@PathParam("serviceId") String serviceId) {
return null;
}
}
服务实现中的附加注解导致路径解析失败。由于我在 Eclipse 中实现了 getService
,它工作正常,但是在我删除服务实现中的参数注释之前,实现的 IntelliJ 的新方法不起作用。