RESTful веб-сервис: java.lang.NullPointerException service.AbstractFacade.findAll - PullRequest
3 голосов
/ 25 декабря 2011

Я создал простой веб-сервис XML с помощью мастера NetBeans 7 «RESTful Web Services from Database ...». На данный момент я хочу опубликовать список пользователей из связанной базы данных mySQL.

Когда я пытаюсь получить доступ к сервису через его URL (http://localhost:8080/database/resources/users),, я получаю сообщение об ошибке «java.lang.NullPointerException». Трассировка стека:

service.AbstractFacade.findAll(AbstractFacade.java:41)
service.UserFacade.findAll(UserFacade.java:51)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:165)
com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:67)
com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:276)
com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:83)
com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:133)
com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:71
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1171)  com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1103)  com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1053)
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1043)
com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:406)
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:477)
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:662)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

Пользователь:

package entities;
...
@Entity
@Table(name="users")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u"), 
...

Я также изменил именованный запрос на User.findAll, если имена должны совпадать с именем объекта. Это не решило проблему.

Я не уверен, что это «нормально» или нет, но мастер создал довольно редкий класс UserFacade; Я добавил недостающие методы после исследования темы. Кроме того, пакет javax.ejb.Stateless, кажется, отсутствует (возможно, не на CLASSPATH моей рабочей станции); по этой причине аннотация @Stateless отключена.

Класс UserFacade:

//@Stateless
@Path("users")
public class UserFacade extends AbstractFacade<User> {

    @PersistenceContext(unitName="databasePU") 
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public UserFacade() {
        super(User.class);
    } 

    @GET
    @Path("{id}")
    @Produces({"application/xml", "application/json"})
    public User find(@PathParam("id") BigDecimal id) {
        return super.find(id);
    }

    @GET
    @Override
    @Produces({"application/xml", "application/json"})
    public List<User> findAll() {
        return super.findAll();
    } 

}

Исключение выдается в первой строке метода findAll в AbstractFacade:

public List<T> findAll() {  

  javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
  ...
}

Вопросы:

  • Требуется ли аннотация @Stateless для этой функции?
  • Требуется ли для этого шаблона J2EE 6, а не J2SE 6 (что установлено на моей рабочей станции OS X)? Кажется, что пространство имен 'javax.ejb' предлагает корпоративные Java-бины.

** редактировать **

  • Java SE 6 (1.6.0_29-b11-402)

Ответы [ 2 ]

2 голосов
/ 15 января 2012

Автоматически сгенерированный запрос "ВЫБЕРИТЕ ОТ ОТ Пользователей" работает без проблем.Согласно комментарию, предполагающему, что «u» может быть неправильным, поскольку он не представляет столбец, это предложение является неправильным, поскольку здесь «u» является псевдонимом для пользователей таблицы.

Я бы далее отлаживалfindAll(), чтобы проверить, является ли что-то нулевым, то есть EntityManager.

Необходима аннотация @Stateless в UserFacade, и удаление ее, вероятно, приведет к тому, что EntityManager будет нулевым (обратите внимание, что я написалудаление "потому что NetBeans помещает, если для вас, если вы используете мастер" RestFul Web Services from Database ").Смотрите здесь аналогичный вопрос.

Относительно вашего последнего редактирования: да, эти функции должны быть построены с использованием Java Platform, Enterprise Edition .В частности, веб-сервисы RESTFul используют Java API для веб-сервисов RESTful (JAX-RS), который включен в платформу Java EE 6, как объяснено здесь .

GlassFish Server Open Source Edition - первая совместимая реализация спецификации платформы Java EE 6: я предлагаю использовать этот сервер приложений и следовать учебным пособиям, указанным выше.

0 голосов
/ 15 января 2012

Я думаю, что @ori ответит.Ваша таблица Users, вероятно, не имеет столбца с именем u, поэтому вы получаете исключение, когда она пытается сопоставить столбец u с базой данных.

Измените на u.*, и он должен работатьхорошо.

...