泽西制作媒体类型冲突 [英] Jersey Producing media type conflict

查看:109
本文介绍了泽西制作媒体类型冲突的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试泽西岛,请点击这个链接来设置网络服务在netbeans。我有我的实体类和我的REST类。
它可以从javafx2客户端添加,编辑,删除,请求对象(在本例中为Users对象)。

I'm trying out Jersey at the moment, followed this link to set up a web service in netbeans. I have my entities classes and my REST classes. It works to add, edit, delete, request objects (in this case Users objects) from a javafx2 client.

但是,现在我尝试添加一个我的webservice的新方法,用于一些简单的身份验证。首先,我在Users.java文件中添加了一个新的命名查询(Users.login):

However, now I try to add a new method to my webservice for some simple authentication. First I added a new named query (Users.login) in the Users.java file:

@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生成):

Afterwards I added following code to my UsersFacadeREST.java file (generated by 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服务时收到以下错误:

However, I receive following error when trying to deploy the web service:

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个String参数并给出一个Users对象,第二个有2个整数参数并返回一个List对象?有没有办法解决这个问题,因为我需要在我的网络服务中添加一些自定义查询......

As I'm new to this, I have no clue why the login() method is giving a conflict with findRange()? The first has 2 String parameters and give a Users object, the second has 2 integer parameters and returns a List object? Is there any way to fix this problem as I'm gonna need some custom queries added to my webservice...

完成时间:

@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)

Code in super class (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();
}


推荐答案

问题是,两种方法正在使用匹配相同URI的路径模板。 {a} / {b}相当于{c} / {d} - 在同样的方式{username} / {password}相当于{from} / {to}。并且因为两种方法也使用相同的媒体类型,所以存在歧义。您可以通过在路径模板中使用正则表达式来解决此问题,以使其更具体。即由于{from} / {to}应始终为数字,您可以通过更改它来消除歧义:{from:[0 -9] +} / {to:[0-9] +}

The problem is, both methods are using path templates that match the same URIs. "{a}/{b}" is equivalent to "{c}/{d}" - in the same way "{username}/{password}" is equivalent to "{from}/{to}". And because both methods also use the same media type, there is an ambiguity. You can fix this by using a regular expression in the path template to make it more specific. I.e. since "{from}/{to}" should always be numbers, you can disambiguate it by changing it like follows: "{from: [0-9]+}/{to: [0-9]+}".

无论如何,你确定没有用户会选择普通用户名和密码的数字?看起来在你的情况下,为两个资源中的每一个使用不同的URI子空间会好得多。例如: login / {username} / {password} ranges / {from} / {to}

Anyway, are you sure no user will pick plain numbers from username and password? Looks like in your case it would be much better to use different URI "sub-space" for each of the two resources. E.g.: login/{username}/{password} and ranges/{from}/{to}.

但设计上几点:


  1. 这是非常错误想法将密码放入URI中。从来没有做过!查看一些现有的经过验证的身份验证方案 - 不要试图重新发明轮子。

  2. 考虑使用查询参数来指定范围 - 例如如果您有一些收集资源(例如myapp.com/calendar/events),您可以使用查询参数对范围建模 - 例如myapp.com/calendar/events?from=xxx&to=yyy。

  1. It is a very bad idea to put passwords in the URI. Never ever do it! Look at some existing proven authentication schemes - don't try to reinvent the wheel.
  2. Consider using query params for specifying ranges - e.g. if you have some collection resource (like "myapp.com/calendar/events") you can model ranges using query parameters - e.g. "myapp.com/calendar/events?from=xxx&to=yyy.

这篇关于泽西制作媒体类型冲突的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆