Java Jax-rs正则表达式路径

Java Jax-rs正则表达式路径,java,regex,google-app-engine,jax-rs,resteasy,Java,Regex,Google App Engine,Jax Rs,Resteasy,我有这个Jax-rs服务接口: @GET @Path("{id: ^((?!_ah).)*$}") @Produces(MediaType.TEXT_HTML) public Response getStuff(@PathParam("id") String id, @Context HttpHeaders headers, @Context UriInfo uriInfo, @Context SecurityContext securityContext); 此接口的

我有这个Jax-rs服务接口:

@GET
@Path("{id: ^((?!_ah).)*$}") 
@Produces(MediaType.TEXT_HTML)  
public Response getStuff(@PathParam("id") String id, @Context HttpHeaders headers, 
        @Context UriInfo uriInfo, @Context SecurityContext securityContext);
此接口的目标是捕获除以下字符外的所有字符序列:

_ah/foo
_ah/foo/bar
或者任何以
\u ah

我试过正则表达式:

从表面上看,它的效果与预期相符。然而,我现在的问题是,当我访问一个被假定为绕过的路径时,我会得到以下结果:

 Could not find resource for relative : /_ah/admin of full path: http://127.0.0.1:8888/_ah/admin
我的应用程序在GAE上运行,因此在开发模式下运行时,此路径用于SDK运行时的管理
servlet
s

我错过了什么?当@Path过滤器不匹配时,它不是会绕过它吗?那么为什么我会遇到
找不到资源
的问题呢


如果我不放置:
@Path({id:^((?!\u-ah)。*$})
路径下的servlet工作正常。是不是
\u ah
路径已经被绕过,应该可以再次访问

我在将RestEasy升级到3.0.10时遇到了这个问题。我有一个@Path({id})和@Path(“jobs”)冲突,它来自遗留代码。由于有第三方应用程序,我无法在不经过漫长过程的情况下更改rest端点。幸运的是,regex解决方案对我来说确实有效。虽然我不能说为什么它不适用于原始海报

这让我头痛了好几天,我想知道我的问题在哪里,以及如何解决它。如果您处于类似的情况,并且更改rest端点不是一个可行的选择,我也会这样做

原始类别:

@Path("device")
public class DeviceApi
{
    @PUT
    @Path("{id}")
    public Device deviceAction(..., Device device) {...}
}
冲突的正则表达式类:

@Path("device")
public class JobsDeviceApi
{
    @PUT
    @Path("jobs")
    public void moveJobs(..., Jobs jobs)
}
修改后的DeviceApi类可以工作:

@Path("device")
public class DeviceApi
{
    @PUT
    @Path("{id: ^(jobs)}")
    public Device deviceAction(..., Device device) {...}
}

很明显,你可以把任何你想要的正则表达式放进去。我只需要它忽略单一路径,所以我使用了KISS原则(保持简单愚蠢)。

你所说的“*如果我不做:
@path({id:^((?!\u ah.))*$}”)
*?去掉方法或注释?另外,你的正则表达式是不正确的。
^((?!\u ah)。*$
也将与另一个地方不匹配“
。你应该使用
^(?!\u ah)。*$
。好的,我知道了,谢谢,但即使使用了正确的正则表达式,我仍然会得到“找不到相对资源”是的,但你没有澄清。你说“如果我不放:
@Path({id:^((?!\u-ah)。*$}”)
路径下的servlet工作正常。”。什么是“不要放”?是否删除
@Path
注释?删除该方法?