2016-12-08 4 views
-1

Меня попросили сделать приложение с AngularJs, Bootstrap, Java и Tomcat в качестве сервера. Я новичок в java ee, поэтому, возможно, моя ошибка довольно проста, но я не могу найти решение.404 NullPointerException с AngularJs Java и Jersey

Так что, когда я начало проекта я вижу мое угловое приложение, но когда я нажимаю кнопку, и она вызывает http://localhost:8080/MissingDogPoc/res/dog я получаю эту ошибку:

Http Статус 500:

java.lang.NullPointerException 

com.gabriel.missingdogpoc.service.AbstractFacade.findAll(AbstractFacade.java:42) 

com.gabriel.missingdogpoc.service.DogFacadeREST.findAll(DogFacadeREST.java:69) 

sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 

sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 

sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 

java.lang.reflect.Method.invoke(Method.java:498) 

com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) 

com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185) 

com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) 

com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302) 

com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) 

com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 

com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) 

com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1511) 

com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1442) 

com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391) 

com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381) 

com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) 

com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538) 

com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716) 

javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 

org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 

РЕШЕНИЯ

Прежде всего, если у вас есть web.xml в вашем WEB-INF, он вам не нужен, если у вас есть «ApplicatiationConfig.java» (это автоматически сгенерировано, если вы следуете инструкциям netbeans, которые там есть)

код будет выглядеть следующим образом:

package com.gabriel.missingdogpoc.service; 

import java.util.Set; 
import javax.ws.rs.ApplicationPath; 
import javax.ws.rs.core.Application; 

@ApplicationPath("api") 
public class ApplicationConfig extends Application { 

    @Override 
    public Set<Class<?>> getClasses() { 
     Set<Class<?>> resources = new java.util.HashSet<>(); 
     addRestResourceClasses(resources); 
     return resources; 
    } 
    private void addRestResourceClasses(Set<Class<?>> resources) { 
     resources.add(com.gabriel.missingdogpoc.service.DogFacadeREST.class); 
    } 

} 

Тогда, поскольку Tomcat его в «Web-сервер», а не «Application Server» мы должны управлять ПРИМИТИВЫ сами! Таким образом, мы должны сделать наш Entity менеджер:

LocalEntityManagerFactory.java

package com.gabriel.missingdogpoc.util; 

import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 
import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 
import javax.servlet.annotation.WebListener; 
@WebListener 
public class LocalEntityManagerFactory implements ServletContextListener{ 
    private static EntityManagerFactory emf; 
    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     emf = Persistence.createEntityManagerFactory("com.gabriel_MissingDogPoc_war_1.0-SNAPSHOTPU"); 
    } 
    @Override 
    public void contextDestroyed(ServletContextEvent event) { 
     emf.close(); 
    } 
    public static EntityManager createEntityManager() { 
     if (emf == null) { 
      throw new IllegalStateException("Context is not initialized yet."); 
     } 
     return emf.createEntityManager(); 
    } 
} 

И теперь, так как у нас есть собственный менеджер сущности, мы должны использовать его в нашей службе отдыха. Вы, вероятно, «Abrstract Фасад», если вы сгенерировали его с NetBeans, и вам придется заменить:

protected abstract EntityManager getEntityManager(); 

public void create(T entity) { 
    getEntityManager().getTransaction().begin(); 
    getEntityManager().persist(entity); 
    getEntityManager().getTransaction().commit();   
} 
    public List<T> findAll() { 
    getEntityManager().getTransaction().begin(); 
    javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
    cq.select(cq.from(entityClass)); 
    List<T> res= getEntityManager().createQuery(cq).getResultList(); 
    getEntityManager().getTransaction().commit();   
    return res; 
} 

Если у вас есть какие-либо проблемы с внутренним интерфейсом вы можете проверить свой код в GitHub/Gaabooo/MissingDogPoc/

+0

Я настоятельно рекомендую пойти с помощью Springboot, чтобы избежать появления головного света. –

ответ

0

Ваша проблема заключается в том, что вы используете Tomcat, который является реализацией спецификаций Servlet и JSP.

Вы пытались превратить его в веб-контейнер JavaEE 7, добавив к нему Джерси и EclipseLink. К сожалению, по-прежнему будет отсутствовать интеграция между компонентами. В вашем случае Джерси не знает, что ему нужно ввести EntityManager в ваш объект DogFacadeREST, поэтому вы получите исключение NullPointerException, как только вы попытаетесь его вызвать. Кроме того, аннотация @Stateless будет полностью проигнорирована, так как для этого вам необходимо включить поддержку EJB.

Это проще использовать что-то вроде WildFly, TomEE или GlassFish, а затем вы можете выбросить все эти зависимости (за исключением javaee-web-api).

+0

Вот в чем проблема! Дело в том, что я не могу использовать ничего, кроме tomcat! Я решил это сделать, чтобы создать собственный EntityManager! Я сделаю обновление, как только мой проект будет выполняться на 100%: D –

+1

Ну, технически TomEE является Tomcat с битами, которые вам нужно добавить и интегрировать ... –

+0

Я решил проблему и обновил сообщение :) Я красные тонны парней с той же проблемой в stackoverflow, но никто не ответил так, как вы это делали :) Это была основная проблема :) (у меня были другие проблемы с зарезервированными ключевыми словами Mysql, но они не потому, что у меня была ошибка 404 или 500). –

Смежные вопросы