当前位置: 首页 > 知识库问答 >
问题:

泽西岛生产媒体类型冲突

甘永春
2023-03-14

我现在正在尝试泽西,按照这个链接在netbean中设置了一个网络服务。我有我的实体类和REST类。它可以从javafx2客户端添加、编辑、删除、请求对象(在本例中是用户对象)。

然而,现在我尝试向我的网络服务添加一个新方法来进行一些简单的身份验证。首先,我在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文件(由Netbean 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个字符串参数并给出一个Users对象,第二个有2个整数参数并返回一个List对象?有没有办法解决这个问题,因为我将需要一些自定义查询添加到我的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();
}

共有1个答案

蔺沛
2023-03-14

问题是,这两种方法都使用匹配相同URIs的路径模板。< code >“{ a }/{ b }”等效于< code >“{ c }/{ d }”-同样地,< code >“{ username }/{ password }”等效于< code >“{ from }/{ to }”。因为这两种方法也使用相同的媒体类型,所以存在歧义。您可以通过在路径模板中使用正则表达式使其更加具体来解决这个问题。也就是说,由于< code>"{from}/{to}"应该始终是数字,您可以通过如下方式更改它来消除歧义:< code > " { from:[0-9]}/{ to:[0-9]} " 。

无论如何,你确定没有用户会从用户名和密码中选择普通数字吗?看起来在您的情况下,对两个资源中的每一个使用不同的URI“子空间”会好得多。例如:< code >登录/{用户名}/{密码}和< code >范围/{从}/{到}。

但是,设计上的几点:

  1. 在URI中输入密码是一个非常糟糕的主意。永远不要这样做!看看一些现有的经验证的身份验证方案,不要试图重新发明轮子
  2. 考虑使用查询参数来指定范围-例如,如果您有一些集合资源(如“myapp.com/calendar/events”),则可以使用查询参数对范围进行建模-例如“myapp.com/calendar/events?from=xxx
 类似资料:
  • 下面在我的restful资源类中定义了这两个方法。我在用泽西。但是当我试图运行一个单元时,它说错误,它们有相同的媒体类型。我是不是漏掉了什么? 严重:在资源和/或提供程序类中检测到以下错误和警告:严重:产生媒体类型冲突。资源方法public javax.ws.rs.core.response com.thomsonreuters.codes.sourcedocweb.resource.docume

  • 我使用的是一个restful web服务,CRUD操作可以在其中工作,除了在一个页面上列出每个用户。getUser()方法仅用于登录webapp。我已经看了这个问题,但我没有使用命名查询。 我得到的错误:: 严重:产生媒体类型冲突。资源方法public…UserResource.getUser()和…UserResource.list()抛出org.codehaus.jackson.JsonGen

  • 我正在尝试使用Jersey作为框架实现一个小的REST API,原则上代码工作正常,但是当我尝试对哈希表进行“GET”时,我得到以下错误: 这是有问题的一行: 这就是我实现服务的方式: pom公司。xml(maven依赖项) 服务器端配置: 在客户端中注册杰克逊时出错: 新类别: 术语类: 有人能帮我退回地图吗?

  • 我目前使用的是球衣 我现在要做的是设置泽西,这样当查询参数进来时(比如缩进),我可以告诉Jackson以“更漂亮的格式,也就是缩进”序列化JSON。您可以通过使用SerializationConfig.Feature.INDENT_OUTPUT配置JSON映射器来轻松地告诉Jackson这样做。 问题是,我如何在每个请求的基础上获取一个queryparam并使用它来修改Jackson的输出?

  • 我一直在写RESTful Web服务。我使用的技术: 玻璃鱼3(基于Java6) JDK v7 Eclipse EE Kepler 泽西岛(Glassfish的一部分) 我为自定义MediaType创建了自定义POJO: 我的资源方法: 我的邮件正文作者: } 我的服务客户: 根路径: } 当我运行应用程序时,我从我的服务客户端获得以下输出: 我想使用自定义媒体类型和,以便更好地了解RESTful

  • 我正在尝试遵循Jersey文档,以便在发生错误时启用非200响应(https://Jersey.java.net/documentation/latest/representations.html#D0E3586) 我的代码看起来像: 不幸的是,这会产生以下错误: [2015-02-01T16:13:02.157+0000][glassfish 4.1][严重][][org.glassfish.j