我目前正在试用 Jersey,按照此链接在 netbeans 中设置 Web 服务。我有我的实体类和我的 REST 类。它可以从 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
由于我是新手,我不知道为什么 login() 方法会与 findRange() 发生冲突?第一个有 2 个 String 参数并给出一个 Users 对象,第二个有 2 个整数参数并返回一个 List 对象?有什么办法可以解决这个问题,因为我需要将一些自定义查询添加到我的网络服务中......
完成:
@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();
}