Apache CXF - 处理操作中丢失的路径参数
Apache CXF - Handle missing path parameters in an operation
我在我的项目中使用 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 中定义的操作名称发出请求的情况下,它将 return 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)将您的路径参数移动到查询参数。 @QueryParam
2) 创建一个过滤器并将其映射到 url operation1/*
在为我需要验证路径参数的场景寻找解决方案时,我发现 this link 这为我的问题提出了一个很好的解决方法。虽然它只是一个 hack,在现有代码中实现可能不是一个好主意,但如果您需要在各自的操作中使用路径参数,您可以考虑它。
我在我的项目中使用 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 中定义的操作名称发出请求的情况下,它将 return 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)将您的路径参数移动到查询参数。 @QueryParam
2) 创建一个过滤器并将其映射到 url operation1/*
在为我需要验证路径参数的场景寻找解决方案时,我发现 this link 这为我的问题提出了一个很好的解决方法。虽然它只是一个 hack,在现有代码中实现可能不是一个好主意,但如果您需要在各自的操作中使用路径参数,您可以考虑它。