我可以在同一个类中的两个方法中使用@GET注释吗?

时间:2016-03-25 12:21:13

标签: java jersey jax-rs

@GET
@Produces(MediaType.APPLICATION_JSON)
public String getRscSubTypes(){
    return AddResourceMysql.getRscSubType();
}    

@GET
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String getDbTypes() {
    return AddResourceMysql.getDbType();
}

这将返回以下异常:

org.glassfish.jersey.server.model.ModelValidationException: 
Validation of the application resource model has failed during application initialization.

你能帮帮我吗?

2 个答案:

答案 0 :(得分:1)

如果要在同一个类中定义多个处理同一MIME type的GET请求的资源方法,则必须为这些方法指定不同的子路径:

@Path("rcsubtypes")
@GET
@Produces(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public String getRscSubTypes()
{
    return AddResourceMysql.getRscSubType();
}  

@Path("dbtypes") 
@GET
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String getDbTypes()
{
    return AddResourceMysql.getDbType();
}

此方法的@Path注释中指定的路径是类的@Path注释中指定的路径的子路径,该路径是您为应用程序定义的路径的子路径

要解释您的行为,如果第一个方法上没有@Consumes注释,则始终会调用第二个方法:@Consumes定义哪个媒体类型(在Content-Type header中设置请求)可以被该方法接受。如果没有@Consumes注释,则接受所有请求,但我认为,如果方法指定了接受的媒体类型,则会优先考虑。

球衣文档中的匹配部分:3.1. Root Resource Classes

答案 1 :(得分:1)

请求匹配如何工作

当然,您可以在同一个类中使用@GET注释多个方法。但是,您当前的定义是含糊不清

有关更多说明,请查看JAX-RS 2.0 specification

  

3.7.2请求匹配

     

通过比较规范化的请求URI ,任意请求实体的媒体类型,将请求与相应的资源方法或子资源方法相匹配,以及请求的响应实体格式到资源类及其方法的元数据注释。 [...]

如何解决

您需要更改方法注释,以确保您没有歧义。为此,您可以使用以下注释:

要修复它,例如,您只需为每个方法添加具有不同值的@Path注释。