我可以在同一方法上同时使用@ Post和@Get

时间:2013-06-27 08:57:20

标签: jersey tomcat7

我想在@Post和@Get上使用同样的方法,比如

@GET
@POST
@Path("{mode}")
public void paymentFinish(@PathParam("mode") String mode, String s) {
    logger.debug("Enter PayStatus POST");
    logger.debug(mode);
}

即使我这样写,也有错误。我想要的是无论是获取还是发布到同一个方法,相同的方法都有效。可能吗?现在我将两个方法分开,一个用于get,另一个用于post。

2 个答案:

答案 0 :(得分:11)

不幸的是,只应使用一个以避免泽西异常。 但你可以这样做:

@GET
@Path("{mode}")
public void paymentFinish(@PathParam("mode") String mode, String s) {
    commonFunction(mode);
}

@POST
@Path("{mode}")
public void paymentFinishPOST(@PathParam("mode") String mode, String s) {
    commonFunction(mode);
}

private void commonFunction(String mode)
{
    logger.debug("Enter PayStatus POST");
    logger.debug(mode);
}

通过这样做,如果你想改变你的功能的内在行为,你只需要改变一个功能。

请注意,java for get vs post中的方法名称必须不同。

答案 1 :(得分:1)

在搜索了很多试图避免上述解决方案之后,我什么都没发现......

然后我决定创建一个自定义注释,这样我就不必浪费时间重复方法了。

这是github链接:Jersey-Gest

它允许您通过从中生成新类来在单个Annotation上创建GET和Post方法。

我希望它能帮助你,就像它帮助我一样:)

编辑:

如果由于某种原因上述链接停止工作,我就是这样做的:

  • 为类方法创建了一个编译时注释 @RestMethod
  • 为类创建了一个编译时注释 @RestClass
  • 创建一个AnnotationProcessor,使用Jersey的相应注释生成一个新类,并为每个方法创建一个 GET 和一个 POST 方法,该方法回调到用 @RestClass

所有使用 @RestMethod 注释的方法必须是静态的,并且包含在使用 @RestClass 注释的类中。

示例(TestService.java):

@RestClass(path = "/wsdl")
public class TestService
{

    @RestMethod(path = "/helloGest")
    public static String helloGest()
    {
        return "Hello Gest!";
    }

}

生成类似(TestServiceImpl.java)的内容:

@Path("/wsdl")
@Produces("application/xml")
public class TestServiceImpl
{
    @GET
    @Path("/helloGest")
    @Produces(MediaType.APPLICATION_XML)
    public String helloGestGet()
    {
        return TestService.helloGest();
    }

    @POST
    @Path("/helloGest")
    @Consumes(MediaType.WILDCARD)
    @Produces(MediaType.APPLICATION_XML)
    public String helloGestPost()
    {
        return TestService.helloGest();
    }
}