尝试使用 AWS tomcat CDI 创建 NamedQuery 时出现空异常

问题描述

我将 AWS tomcat 8.5 与weld 结合使用,当尝试从实体管理器创建命名查询时,发生以下错误

Exception Make:getCars():Generic,Message:[null]
sb.boundary.SampleBoundary.getCars(SampleBoundary.java:74)
sb.view.SampleView.getCars(SampleView.java:82)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.base/java.lang.reflect.Method.invoke(Method.java:566)
javax.el.BeanELResolver.getValue(BeanELResolver.java:94)
com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
org.apache.el.parser.AstValue.getValue(AstValue.java:169)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:190)
org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
javax.faces.component.UIData.getValue(UIData.java:732)
org.primefaces.component.api.UIData.lambda$isLazy$0(UIData.java:83)
org.primefaces.util.ComponentUtils.eval(ComponentUtils.java:492)
org.primefaces.component.api.UIData.isLazy(UIData.java:83)
org.primefaces.component.datalist.DataListRenderer.encodeMarkup(DataListRenderer.java:79)
org.primefaces.component.datalist.DataListRenderer.encodeEnd(DataListRenderer.java:73)
javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:924)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:456)
com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:134)
javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:544)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:764)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:698)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:353)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:616)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:831)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1629)
org.apache.tomcat.util.net.socketProcessorBase.run(SocketProcessorBase.java:49)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.base/java.lang.Thread.run(Thread.java:829)

边界的代码如下:

/*
 * To change this license header,choose License Headers in Project Properties.
 * To change this template file,choose Tools | Templates
 * and open the template in the editor.
 */
package sb.boundary;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.noresultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import sb.entity.Car;
import sb.entity.DummyCar;

/**
 *
 * @author multicoder
 */
@Stateless
//Don't forget to put a persistance context
//https://developer.jboss.org/thread/223578

public class SampleBoundary implements Serializable {

    //@Inject
    @PersistenceContext(unitName = "SamplePU")
    private EntityManager em;

    /**
     * This method is here to return a dummy set of data,this does not require
     * a working persistence unit
     *
     * @return
     */
    public List<DummyCar> getDummyCars() {
        List<DummyCar> dummyCars = new ArrayList<>();
        DummyCar dc = new DummyCar();
        dc.setCarId(1);
        dc.setMake("Found On Road Dead (FORD)");
        dc.setModel("Vulture");
        dc.setYear(1977);
        dummyCars.add(dc);
        dc = new DummyCar();
        dc.setCarId(2);
        dc.setMake("Telsa Coil");
        dc.setModel("Down With Edison V2");
        dc.setYear(1931);
        dummyCars.add(dc);
        dc = new DummyCar();
        dc.setCarId(3);
        dc.setMake("Prius");
        dc.setModel("Maximum of the minimum legal size Mark IIIIIV");
        dc.setYear(2013);
        dummyCars.add(dc);
        return dummyCars;
    }

    public List<Car> getCars() {
        List<Car> cars = null;
        try {
            if (em == null) {
                cars = new ArrayList<>();
                Car car = new Car();
                car.setCarId(-1);
                car.setMake("getCars():Em is null error");
                car.setModel("getCars():We just have no entity manager to deal with");
                cars.add(car);
            }
            if(!em.isopen()){
                cars = new ArrayList<>();
                Car car = new Car();
                car.setCarId(-1);
                car.setMake("getCars():Em is not open error");
                car.setModel("getCars():We just have no entity manager to deal with");
                cars.add(car);
            }
            Query query = em.createNamedQuery("Car.findAll",Car.class);
            cars = query.getResultList();
            if (cars.size() == 1) {
                cars = new ArrayList<>();
                Car car = new Car();
                car.setCarId(-1);
                car.setMake("Query was non error car");
                car.setModel("We just have no cars to report :|");
                cars.add(car);
            }
        } catch (noresultException e) {
            System.out.println("Exception when pulling car data via entity!");
            System.out.println("It is:" + e.getMessage());
            cars = new ArrayList<>();
            Car car = new Car();
            car.setCarId(-1);
            car.setMake("Exception Make:getCars():noresultException");
            car.setModel(e.getMessage());
            cars.add(car);
        } catch (Exception e) {
            System.out.println("Exception when pulling car data via entity!");
            System.out.println("It is:" + e.getMessage());
            cars = new ArrayList<>();
            Car car = new Car();
            car.setCarId(-1);
            car.setMake("Exception Make:getCars():Generic");
            StringBuilder sb = new StringBuilder();
            sb.append("Message:[").append(e.getMessage()).append("]<br/>");
            if (e.getCause() != null) {
                Throwable cause = e.getCause();
                sb.append("Cause:[").append(cause.getMessage()).append("]<br/>");
            }
            for (StackTraceElement ste : e.getStackTrace()) {
                sb.append(ste.toString()).append("<br/>");
            }
            car.setModel(sb.toString());
            cars.add(car);
        }
        return cars;
    }

    public void createSampleCars() {
        try {
            Car car = new Car();
            car.setCarId(1);
            car.setMake("Test Car saved by app!");
            car.setModel("Tester,model... the car model");
            car.setYear(2021);
            em.persist(car);
        } catch (Exception e) {
            Car car = new Car();
            car.setCarId(1);
            car.setMake("Exception bus! createSampleCars()");
            car.setModel(e.getMessage());
            car.setYear(2021);
        }
    }

    public String doQuery(String query){
        return "";
    }
}

这是persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
  <!-- Define Persistence Unit -->
  <persistence-unit name="SamplePU">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>jdbc/testDS</jta-data-source>
    <class>sb.entity.Car</class>
  </persistence-unit>
</persistence>

这是context.xml

<Context>
    <Resource 
        name="BeanManager"  
        auth="Container"
        type="javax.enterprise.inject.spi.BeanManager"
        factory="org.jboss.weld.resources.ManagerObjectFactory"/>
        <Resource
        name="jdbc/testDS"
        auth="Container"
        type="javax.sql.DataSource"
        driverClassName="oracle.jdbc.OracleDriver"
        url="sampledatabase.theserver.amazonaws.com"
        username="TheUserName"
        password="ThePassWord" /> 
</Context>

如果需要,可以在此处找到完整的电流源。 https://github.com/multicoder/tomcatTest

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)