Джерси. - программирование
Подтвердить что ты не робот

Джерси.

На данный момент я попробую Джерси, а затем эту ссылку, чтобы настроить веб-сервис в netbeans. У меня есть классы объектов и классы REST. Он работает, чтобы добавлять, редактировать, удалять, запрашивать объекты (в данном случае объекты "Пользователи" ) из клиента javafx2.

Однако теперь я пытаюсь добавить новый метод для своего веб-сервиса для некоторой простой проверки подлинности. Сначала я добавил новый именованный запрос (Users.login) в файл Users.java:

@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();
}

Однако при попытке развернуть веб-службу я получаю следующую ошибку:

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();
}
4b9b3361

Ответ 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}.

НО, несколько баллов по дизайну:

  • Идея очень плохой заключается в том, чтобы вводить пароли в URI. Никогда не делай этого! Посмотрите на некоторые существующие проверенные схемы аутентификации - не пытайтесь изобретать колесо.
  • Рассмотрите возможность использования параметров запроса для указания диапазонов - например. если у вас есть ресурс коллекции (например, "myapp.com/calendar/events" ), вы можете моделировать диапазоны с использованием параметров запроса - например. "Myapp.com/calendar/events?from=xxx&to=yyy.