使用@DefaultMethod批注时,Apache CXF不会通过http方法选择

时间:2019-01-15 09:33:34

标签: jax-rs cxf

我的资源中有两种POST方法和一种DELETE。它们具有相同的路径。

我用@DefaultMethod注释了一个POST,因此当某人未发送正确的Accept标头时,将选择正确的方法。但这导致在调用DELETE时,cxf选择POST而不是正确的删除方法。有什么解决方法吗?

CXF版本:3.1.17

@DefaultMethod
@POST
@Consumes(MeasurementMediaType.MEASUREMENT_TYPE)
@Produces(MeasurementMediaType.MEASUREMENT_TYPE)
public Response post(MeasurementRepresentation measurementRepresentation, @HeaderParam(value = HttpHeaders.ACCEPT) String acceptHeader) URISyntaxException {
    ...
}

@POST
@Consumes(MEASUREMENT_COLLECTION_TYPE)
@Produces(MEASUREMENT_COLLECTION_TYPE)
public Response post(MeasurementCollectionRepresentation measurementCollectionRepresentation, @HeaderParam(value = HttpHeaders.ACCEPT) String acceptHeader) {
 ...
   }


@DELETE
public Response delete(
        @QueryParam("fragmentType") String fragmentType,
        @QueryParam("source") String source,
        @QueryParam("dateFrom") DateTime dateFrom,
        @QueryParam("dateTo") DateTime dateTo,
        @QueryParam("type") String type) {
...
}

java.lang.NullPointerException
at com.cumulocity.measurement.rest.resources.MeasurementCollectionResource.post(MeasurementCollectionResource.java:280)

1 个答案:

答案 0 :(得分:0)

两件事:

1)DefaultMethod似乎不是指要选择的默认方法,而是默认的HTTPMethod。因此,它实际上是覆盖了呼叫的http方法。这是JAX-RS的CXF扩展,因此您可以要求CXF团队更新功能或为您的用例创建新的注释。

2)如果我对您的理解正确,那么您是否希望在有人发送{“ Hello”:“ World”}的正文时调用第一个方法?然后,在尝试构建MeasurementRepresentation时,您是否会出错?如果他们发送了错误的请求,为什么不让CXF用适当的HTTP错误代码进行响应?