新泽西媒体制作类型的冲突(Jersey Producing media type conflict)

2019-08-01 11:35发布

我尝试了球衣的那一刻,跟着这个链接来设置在NetBeans的Web服务。 我有我的实体类和我的安息类。 它的工作原理从javafx2客户端添加,编辑,删除,请求对象(在这种情况下,用户对象)。

不过,现在我尝试一种新的方法添加到我的web服务进行一些简单的身份验证。 首先我加在Users.java文件中的新命名查询(Users.login):

@NamedQueries({
    @NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u"),
    @NamedQuery(name = "Users.login", query = "SELECT u FROM Users u WHERE u.username = :username AND u.password = :password"),
    @NamedQuery(name = "Users.findById", query = "SELECT u FROM Users u WHERE u.id = :id"),
    @NamedQuery(name = "Users.findByUserlevel", query = "SELECT u FROM Users u WHERE u.userlevel = :userlevel"),
    @NamedQuery(name = "Users.findByDisabled", query = "SELECT u FROM Users u WHERE u.disabled = :disabled")
})

后来我加入以下代码到我的UsersFacadeREST.java文件(Netbeans的7.2生成的):

@GET
@Path("{username}/{password}")
@Produces({"application/xml", "application/json"})
public Users login(@PathParam("username") String username, @PathParam("password") String password) {
    return em.createNamedQuery("login", Users.class)
            .setParameter("username", username)
            .setParameter("password", password)
            .getSingleResult();
}

然而,试图部署Web服务时,我收到以下错误:

SEVERE: Producing media type conflict. The resource methods public entities.Users service.UsersFacadeREST.login(java.lang.String,java.lang.String) and public java.util.List service.UsersFacadeREST.findRange(java.lang.Integer,java.lang.Integer) can produce the same media type

由于我是新来这个,我不知道为什么登录()方法是给有findRange()有冲突? 所述第一有2个字符串参数,并给予用户对象,第二个有2点整数的参数,并返回一个列表对象? 有没有办法为我会需要添加到我的web服务的一些自定义查询来解决这个问题?

完成日期:

@GET
@Path("{from}/{to}")
@Produces({"application/xml", "application/json"})
public List<Users> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) {
    return super.findRange(new int[]{from, to});
}

守则超类(AbstractFacade.java)

public List<T> findRange(int[] range) {
    javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
    cq.select(cq.from(entityClass));
    javax.persistence.Query q = getEntityManager().createQuery(cq);
    q.setMaxResults(range[1] - range[0]);
    q.setFirstResult(range[0]);
    return q.getResultList();
}

Answer 1:

问题是,这两种方法都使用匹配相同的URI路径模板。 "{a}/{b}"是等同于"{c}/{d}" -以相同的方式"{username}/{password}"是等同于"{from}/{to}" 而由于这两种方法也使用相同的介质类型,出现混淆。 您可以通过使用正则表达式的路径模板,使其更加具体的解决这个问题。 即因为"{from}/{to}"应始终是数字,你可以通过改变它喜欢它的歧义如下: "{from: [0-9]+}/{to: [0-9]+}"

无论如何,你肯定没有用户会选择纯数字从用户名和密码? 看起来像你的情况会好得多使用不同的URI“亚空间”为每个两种资源。 例如: login/{username}/{password}ranges/{from}/{to}

但是,从设计几点:

  1. 这是一个非常糟糕的主意,把密码中的URI。 永远不要做吧! 看一些现有的成熟的认证方案 - 不要试图推倒重来。
  2. 考虑使用查询参数用于指定范围 - 例如,如果你有一些收集的资源(如“myapp.com/calendar/events”),您可以使用查询参数车型系列 - 如“myapp.com/calendar/events?from=xxx&to=yyy 。


文章来源: Jersey Producing media type conflict