资源模型具有不明确的(子)资源方法,用于 HTTP 方法 GET 和由“@Consumes”和“@Produces”注释定义的输入 mime 类型

A resource model has ambiguous (sub-)resource method for HTTP method GET and input mime-types as defined by"@Consumes" and "@Produces" annotations

当以下内容具有不同的 URL 时,为什么会产生此错误?

@Path("/job/{empId}/empProfile")
public EmpProfileResource delegateToEventProfileResource() {
    EmpProfileResource resource = new EmpProfileResource();
    locator.inject(resource);
    return resource;
}

@Path("/job/{empId}/empTask")
public EmpTaskResource getClientLevelAttendees(@PathParam("clientId") long clientId){
    EmpTaskResource resource = new EmpTaskResource (empId);
    locator.inject(resource);
    return resource;
}


@Path("/")
public class EmpTaskResource{
}
@Path("/")
public class EmpProfileResource{
}

是的,它们都是 GET 并且产生相同的结果,所以?

@GET
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })

错误:

[[FATAL] A resource model has ambiguous (sub-)resource method for HTTP method GET and input mime-types as defined by"@Consumes" and "@Produces" annotations at Java methods public javax.ws.rs.core.Response com.EmpTaskResource.getEmpTasks(java.time.LocalDate,java.time.LocalDate,java.lang.String) and public javax.ws.rs.core.Response com.EmpProfileResource.getEmpProfiles(long,java.lang.String) at matching regular expression /. These two methods produces and consumes exactly the same mime-types and therefore their invocation as a resource methods will always fail.;

从子资源 类 中删除 @Path("/")。子资源 类 不需要它们。如果他们有它们,它们将被添加为根资源 类,如果您正在扫描 @Path 注释 类。这就是问题所在。您没有显示子资源 类 的方法,但由于它们具有相同的根路径,我想问题是由一些重叠的方法引起的。因此,只需删除子资源 类 上的 @Path("/"),就可以了。

我有同样的错误。大多数人通过更改他们的 @Path 注释来解决错误,因为它们无处不在。就我而言,发生了一些不同的事情。例如,我将一个包从 aaa 修改为 bbb。由于某种原因,在部署到服务器的工件中存在 aaa 和 bbb 包,因此资源重复并且服务器引发异常。我必须清除以前部署的工件并部署新的。有人可能还会在出现错误的地方检查这种情况。当然归根结底,原因还是路径无处不在。 我遇到了同样的问题我也更新了版本检查但它给了我同样的问题可能球衣框架作品不支持这个

如果我们在我们的服务中编写了@PathParam 而不是@Path class 或者我们定义相同路径的任何地方,就会出现此错误。

我现在两次遇到这个错误。两者不同:

第一次我有下面上面的GET和POST方法等

@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON})

但是我没有在 class 前面。因此,如果您有不同的 class-资源,例如:

@Path("/users") 
public Class User{}

@Path("/lists")
public Class List{}

那么他们都需要

@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON})

在他们前面:

@Path("/users")
@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON}) 
public Class User{}

第二次我将一个资源(端点)class从一个文件夹移动到另一个文件夹(通过 Intellij 的重构)显然 IDE不承认这一点。然后出现 Panagiotis Piperopoulos 已经描述的确切问题。

为了解决这个问题,我做了以下工作: 转到项目所在的文件夹 (<working_directory>)。在那里你会找到一个名为 target (<working_directory>\target)

的文件夹

我的情况是 1: 一个 war 文件。删除那个。

2: 包含meta-inf 和web-inf 以及index.html 的文件夹。该名称可能是您的模块名称(在 IntelliJ 中:文件 -> 项目结构 -> 模块)。将该文件夹重命名为 <old_name>_old

如果您重新编译代码,那么文件夹和一个新的 .war 文件应该会出现。