0

我有这个 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

或者任何开始_ah

我尝试了正则表达式:http ://rubular.com/

从看起来它按预期工作。但是我现在的问题是,当我访问一个所谓的绕过路径时,我得到了这个:

 Could not find resource for relative : /_ah/admin of full path: http://127.0.0.1:8888/_ah/admin

我的应用在 GAE 上运行,所以在开发模式下运行时,这个 _ah 路径用于servletSDK 运行时的管理。

我错过了什么?不是@Path过滤器不匹配的时候会绕过吗?那我为什么会遇到Cannot find resource问题?

如果我不说:path@Path("{id: ^((?!_ah).)*$}") 下的 servlet工作正常。_ah是不是_ah已经绕过了路径,应该可以再次访问了?

4

1 回答 1

0

我在将 RestEasy 升级到 3.0.10 时遇到了这个问题。我遇到了来自遗留代码的 @Path("{id}") 和 @Path("jobs") 冲突。由于 3rd 方应用程序,如果没有漫长的过程,我无法更改我的休息端点。幸运的是,正则表达式解决方案确实对我有用。虽然我不能说为什么它不适用于原始海报。

这让我头疼了几天,既要弄清楚我的问题出在哪里,又要如何解决。如果您处于类似情况并且更改您的休息端点不是一个可行的选择,我会分享这一点。

原班:

@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 原则(保持简单愚蠢)。

于 2017-02-06T16:07:21.120 回答