与Jersey的意外REST映射

时间:2017-07-21 17:42:22

标签: java rest jersey jax-rs

在下面的测试用例#3中,我以意想不到的方式登陆。是否有更好的映射策略?

@Path("/pets")


@GET
@Path("/{petId}")       
public Response getPet(@PathParam("petId") String petId){ 
    //fetch a single pet record
}

@GET
@Path("/owner/{ownerId}")   //fetch collection of pet records for an owner
public Response getPetListByOwner(@PathParam("ownerId") String ownerId){ 
    //fetch a list of pet records by ownerId
    //Validate ownerId not null...
}

测试用例#1

/宠物/ 123
//正确调用getPet(" 123")

测试用例#2

/宠物/所有者/ 456
//正确调用getPetListByOwner(" 456")

测试用例#3

/宠物/所有者
// 意外调用getPet()。泽西岛正在使用"所有者"作为getPet()的petId,并调用getPet(" owner")。我希望代码调用getPetListByOwner(),我可以在其中进行空检查,并返回需要ownerId的响应,但我登陆错误的方法(getPet())。虽然我实际上不希望人们点击这个URL,但我无法阻止他们。而且我不想搜索使用petId ="所有者"执行的宠物。无论是。

有更好的映射策略吗?

2 个答案:

答案 0 :(得分:0)

定义另一个显式映射到路径/owner的端点方法(没有其他路径参数)并从那里返回错误响应。

@GET
@Path("/owner")
public Response getPetListByOwner() {
    return Response
            .status(Response.Status.BAD_REQUEST)
            .build();
}

或者,您可以使用一个端点方法和一些与路径模板匹配的正则表达式来声明/owner之后的部分是可选的。 Java EE6教程提供了有关@PathParam模板中正则表达式使用情况的信息。

我更喜欢明确声明额外端点方法的可读性,但这有点主观。

答案 1 :(得分:0)

这是因为您将path参数声明为String。相反,将其声明为int。

代码看起来应该是

@Path("/pets")


@GET
@Path("/{petId}")       
public Response getPet(@PathParam("petId") int petId){ 
    //fetch a single pet record
}

@GET
@Path("/owner/{ownerId}")   //fetch collection of pet records for an owner
public Response getPetListByOwner(@PathParam("ownerId") int ownerId){ 
    //fetch a list of pet records by ownerId
    //Validate ownerId not null...
}

然后您将不会遇到order被识别为ID

的问题