Apache CXF - 处理操作中缺少的路径参数

Posted

技术标签:

【中文标题】Apache CXF - 处理操作中缺少的路径参数【英文标题】:Apache CXF - Handle missing path parameters in an operation 【发布时间】:2015-04-07 07:23:31 【问题描述】:

我在我的项目中使用 apache cxf 来实现 Jax-rs。我有一个使用以下地址定义的服务: http://ip:port/myservice/操作

考虑对该服务器进行如下定义的操作

@Override
@GET
@Path("operation1/x/y")
@Produces("application/xml")
public String operation1(@PathParam("x") final String x, @PathParam("y") final String y) 
    return null;

在请求者使用 myservice 中未定义的某些操作名称发出请求的情况下,它将返回 404,这是预期的行为。但是在正确请求操作名称但路径参数未正确请求的情况下,我会得到相同的 404。如果请求中缺少任何 x 或 y 路径参数,我想创建一个正确的错误。但是我找不到一种可以根据操作处理异常的优雅方式。在这种情况下,CXF 永远不会映射到操作。

我有这个异常映射器:

public class ClientExceptionMapper implements ExceptionMapper<ClientErrorException> 

@Override
public Response toResponse(final ClientErrorException exception) 
    return Response.status(Response.Status.FORBIDDEN).entity("Invalid request").build();


它将处理所有错误情况,但它不提供有关异常中请求的 URL 的任何信息。 在未定义路径参数的情况下,有没有一种方法可以为不同的操作以不同的方式处理异常? 例如:我想使用仅为 operation1 定义的一些自定义逻辑来处理以下请求。 http://ip:port/myservice/operation1/20

【问题讨论】:

【参考方案1】:

对于您的情况,我看到了两种解决方案。 1)将路径参数移动到查询参数。 @QueryParam 2)创建一个过滤器并将其映射到urloperation1/*

【讨论】:

我如何在 CXF 中对特定的 URL 模式进行过滤?? 您可以查看文章,例如此safaribooksonline.com/library/view/java-ee-7/9781449370589/… 或此developerscrappad.com/1781/java/java-ee/rest-jax-rs/… 我查看了拦截器,发现它们过于复杂。对于我的一种情况,我没有时间了解 CXF 中的整个拦截器机制(你必须这样做),但我仍然认为这将是处理错误的更好方法。【参考方案2】:

在为我需要验证路径参数的场景寻找解决方案时,我发现 this link 为我的问题提供了一个很好的解决方法。虽然它只是一个 hack,在现有代码中实现可能不是一个好主意,但如果您需要在各自的操作中使用路径参数,可以考虑它。

【讨论】:

以上是关于Apache CXF - 处理操作中缺少的路径参数的主要内容,如果未能解决你的问题,请参考以下文章

apache cxf rest服务中的Spring异常

使用Apache CXF根据wsdl文件生成代码

彻底了解|利用Apache CXF框架开发WebService

CXF客户端异常

如何向Open Liberty添加专有的Apache CXF功能

使用cxf3.0.4搭建webservice服务需要的最精简jar包