【问题标题】:How to resolve GETJson duplicity exception? [duplicate]如何解决 GETJson 重复异常? [复制]
【发布时间】: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。两者具有相同的路径,没有“/”分割。

我该如何解决?

【问题讨论】:

    标签: java json


    【解决方案1】:

    您的错误信息很清楚:

    这两种方法产生和使用完全相同的 mime 类型,因此它们作为资源方法的调用总是会失败

    您为输入/输出收听相同的路径、相同的 HTTP 方法和 mime 类型。

    您需要使它们不同,以便您的服务器可以清楚地决定调用哪个方法

    例如,您可以将id 添加到第二种方法的路径中。

    @GET
    @Produces("application/json")
    @Path("/id")
    public String getCardapios(@QueryParam("key") String key, 
                               @QueryParam("id") String id   ) {
    ...
    }
    

    但是如果你只想有一个路径,你可以创建两个业务方法,一个只处理key,另一个处理keyid

    private void businessMethod1(String key) {
        // do your stuff
    }
    
    private void businessMethod2(String key, String id) {
        // do your stuff
    }
    
    @GET
    @Produces("application/json")
    @Path("/")
    public String getCardapios(@QueryParam("key") String key, 
                               @QueryParam("id") String id   ) {
        if(id == null) {
            businessMethod1(key);
        } else {
            businessMethod2(key, id);
        }
    }
    

    【讨论】:

    • 但是我在网上找到的方法通常是这样的... "servidor:porta/v1/consumos/?api_key=GUID&codigo=string&modo_venda=(1 à 4)&ticket_id=GUID&item_id=GUID" ...没有“/”。如何仅使用“&”来制作各种方法?
    • servidor:porta/v1/consumos/ 是路径,?api_key=GUID&codigo=string&modo_venda=(1 à 4)&ticket_id=GUID&item_id=GUID 是参数。在您的情况下,您只有一条路径,这就是您出错的原因。 - 如果不清楚,请发布您要用于访问您的应用程序的网址
    • 知道了。想象一下,我可以这样做:"server:port/v1/consumes/?Api_key=GUID&code = string" 或 "server:port/v1/consumes/?Api_key= GUID&code=string&sales_modem=1... 两者都会有相同的地址......但在我的脑海中会有两种方法,不是吗?
    • 不,这是一种单一的方法,但仅适用于 getCardapios。您可以创建两种业务方法,一种采用 2 个参数,另一种采用 3 个参数。我将更新我的 anwser
    猜你喜欢
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 2016-10-20
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    相关资源
    最近更新 更多