【发布时间】:2019-08-08 17:58:59
【问题描述】:
我正在用java开发一个rest服务器,netbeans。
我创建了我的第一个 get 方法,我的类如下所示:
@Stateless
@Path("v1/cardapio")
public class CardapioResource {
private Gson gson = new Gson();
@EJB
private CardapioRemote ejb;
public CardapioResource() {}
@GET
@Produces("application/json")
@Path("/")
public String getCardapios(@QueryParam("key") String key) {
Conta c = ContaDAO.busca(key);
JsonObject obj = new JsonObject();
if(c != null){
JsonArray array = (JsonArray) gson.toJsonTree(ejb.findAll());
obj.add("dados", array);
} else{
JsonObject status = new JsonObject();
status.addProperty("codigo", 401);
status.addProperty("mensagem", "Não há nenhum ID correspondente a este KEY");
obj.add("status", status);
}
return obj.toString();
}
@GET
@Produces("application/json")
@Path("/")
public String getCardapios(@QueryParam("key") String key, @QueryParam("id") String id) {
// second method
}
}
上述方法负责验证数据库中的一个 fkey,如果有效则返回一个菜单列表。
所以我尝试使用第二种方法,获取一个 id ... 并且在验证后它只会返回给定 id 的菜单。我的班级是这样的:
@Stateless
@Path("v1/cardapio")
public class CardapioResource {
private Gson gson = new Gson();
@EJB
private CardapioRemote ejb;
public CardapioResource() {}
@GET
@Produces("application/json")
@Path("/")
public String getCardapios(@QueryParam("key") String key) {
// first method
}
@GET
@Produces("application/json")
@Path("/")
public String getCardapios(@QueryParam("key") String key,
@QueryParam("id") String id ) {
Conta c = ContaDAO.busca(key);
JsonObject obj = new JsonObject();
if(c != null){
JsonArray array = (JsonArray) gson.toJsonTree(ejb.findById(Integer.parseInt(id)));
obj.add("dados", array);
} else{
JsonObject status = new JsonObject();
status.addProperty("codigo", 401);
status.addProperty("mensagem", "Não há nenhum ID correspondente a este KEY");
obj.add("status", status);
}
return obj.toString();
}
}
在包含第二个方法后发生异常:
WebModule[/webPlataformaCardapio]StandardWrapper.Throwable [致命] A 资源模型具有用于 HTTP 的模糊(子)资源方法 方法 GET 并输入由 @Consumes 和 @Produces 定义的 mime 类型 Java 方法的注解 public java.lang.String ws.CardapioResource.getCardapios(java.lang.String) 和公共 java.lang.String ws.CardapioResource.getCardapios(java.lang.String,java.lang.String) 在 匹配正则表达式 /.这两种方法生产和消费 完全相同的 mime 类型,因此它们的调用 资源方法总是会失败。; source='org.glassfish.jersey.server.model.RuntimeResource@4fef476']
想象一下,我有一个服务器 url servidor:porta/api/produtos?key=1 来验证密钥并返回所有产品......我可以拥有 servidor:porta/api/produtos?key=1&id=5验证密钥并仅返回产品 5。两者具有相同的路径,没有“/”分割。
我该如何解决?
【问题讨论】: