gpt4 book ai didi

java - 无状态 EJB 在企业应用程序客户端中抛出 NullPointerException

转载 作者:行者123 更新时间:2023-12-01 11:00:30 24 4
gpt4 key购买 nike

我对 Java EE 比较陌生,对于如何从企业应用程序客户端访问无状态 Java Bean 有点困惑。

我的目的是让我的企业 bean CarReposityImpl 处理名为 Car 的实体类的数据库访问和实体管理。

我的 CarRepositoryImpl 看起来像:

@Stateless
public class CarRepositoryImpl implements CarRepository
{
@PersistenceContext(unitName = "FIT5042AssignmentEJBPU")
private EntityManager entityManager;

@Override
public void addCar(Car car)
{
entityManager.persist(car);
}

@Override
public Car searchByVIN(String vin) throws Exception
{
Car car = entityManager.find(Car.class, vin);
return car;
}

@Override
public List<Car> getAllCars() throws Exception
{
return entityManager.createNamedQuery(Car.GET_ALL_QUERY_NAME).getResultList();
}

@Override
public void removeCar(String vin) throws Exception
{
Car car = searchByVIN(vin);

if (car != null)
{
entityManager.remove(car);
}
}

@Override
public void editCar(Car car) throws Exception
{
entityManager.merge(car);
}
}

它实现了 CarRepository 接口(interface),如下所示:

@Remote
public interface CarRepository
{
public void addCar(Car car);
public Car searchByVIN(String vin) throws Exception;
public List<Car> getAllCars() throws Exception;
public void removeCar(String vin) throws Exception;
public void editCar(Car car) throws Exception;
}

实体类 Car 如下所示:

@Entity
@Table(name = "CAR")
@NamedQueries({@NamedQuery(name = Car.GET_ALL_QUERY_NAME, query = "SELECT c FROM Car AS c")})
public class Car implements Serializable
{
public static final String GET_ALL_QUERY_NAME = "Car.getAll";
//private Sale sale;
String modelNo, VIN, model, make, type, thumbnail, description, prevURL;

public Car() {
}

public Car(String varModelNo, String varVIN, String varModel, String varMake, String varType, String varThumb, String varDesc, String varPrevURL)
{
modelNo = varModelNo;
VIN = varVIN;
model = varModel;
make = varMake;
type = varType;
thumbnail = varThumb;
description = varDesc;
prevURL = varPrevURL;
}

public void setModelNo(String varModNo){modelNo = varModNo;}
public void setVIN(String varVIN){VIN = varVIN;}
public void setModel(String varMod){model = varMod;}
public void setMake(String varMake){make = varMake;}
public void setType(String varType){type = varType;}
public void setThumbnail(String varThumb){thumbnail = varThumb;}
public void setDesc(String varDesc){description = varDesc;}
public void setPrevURL(String varPrev){prevURL = varPrev;}

@Column(name = "modelNo")
public String getModelNo(){return modelNo;}

@Id
@Column(name = "VIN")
public String getVIN(){return VIN;}

@Column(name = "model")
public String getModel(){return model;}

@Column(name = "make")
public String getMake(){return make;}

@Column(name = "type")
public String getType(){return type;}

@Column(name = "thumbnail")
public String getThumbnail(){return thumbnail;}

@Column(name = "description")
public String getDesc(){return description;}

@Column(name = "prevURL")
public String getPrevURL(){return prevURL;}
}

根据我的理解,我应该能够添加这一行:

public class CarSales 
{
@EJB
private static CarRepository carRepo;

到我的企业应用程序客户端中处理我的业务逻辑的类,然后我应该能够调用我的 CarRepositoyImpl bean 中的方法来访问我的数据库。我很确定我不应该像普通对象一样实例化 carRepo 对象,因为 EJB 容器应该处理它。

本质上,我希望能够在我的应用程序客户端中使用我的无状态 bean,如下所示:

List<Car> cars = carRepo.getAllCars();

但是当我这样做时,它会抛出一个空指针异常,我不知道为什么。

我的应用程序客户端类目前而言,它大部分不完整:

public class CarSales 
{
@EJB
private static CarRepository carRepo;

private final MainScreen main;

public CarSales()
{
main = new MainScreen();
addCarActionListeners();
}

public void run()
{
displayAllCars();
}

private void displayAllCars()
{
main.getCarScreen().clearTable();

try
{
List<Car> cars = carRepo.getAllCars();

for(Car car : cars)
{//"VIN", "Model Number", "Model Name", "Make", "Thumbnail", "Description", "URL"
String[] data = new String[7];
data[0] = car.getVIN();
data[1] = car.getModelNo();
data[2] = car.getModel();
data[3] = car.getMake();
data[4] = car.getThumbnail();
data[5] = car.getDesc();
data[6] = car.getPrevURL();
main.getCarScreen().getModel().addRow(data);
}
}
catch(Exception ex)
{
main.getCarScreen().outputAddError(ex.getMessage());
System.out.println("failed");
ex.printStackTrace();
}
}

private void addCarActionListeners()
{//CLOSE
main.getCarScreen().getClose().addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
main.closeWindow();
}
});

main.getCarScreen().getAdd().addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
Car car = new Car(main.getCarScreen().getModelNo(),
main.getCarScreen().getVin(),
main.getCarScreen().getModelName(),
main.getCarScreen().gerMake(),
main.getCarScreen().getType(),
main.getCarScreen().getThumb(),
main.getCarScreen().getDesc(),
main.getCarScreen().getUrl());
try
{
System.out.println("try");
carRepo.addCar(car);
displayAllCars();
}
catch(Exception ex)
{
System.out.println("catch");
//main.getCarScreen().outputAddError(ex.getMessage());
System.out.println(ex.getMessage());
}
}
});
}
}

我的错误的堆栈跟踪:

java.lang.NullPointerException
at CarSales.CarSales.displayAllCars(CarSales.java:45)
at CarSales.CarSales.run(CarSales.java:36)
at CarSales.Main.main(Main.java:18)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.glassfish.appclient.client.acc.AppClientContainer.launch(AppClientContainer.java:446)
at org.glassfish.appclient.client.AppClientFacade.main(AppClientFacade.java:166)

第 45 行是:

List<Car> cars = carRepo.getAllCars();

对我的 CarSales 类进行了一些建议的更改:

public class CarSales 
{
@EJB
private CarRepository carRepo;

private final MainScreen main;

public CarSales()
{
main = new MainScreen();
}

@PostConstruct
public void init()
{
addCarActionListeners();
}

public void run()
{
displayAllCars();
}

我调用 run 的主要函数:

public class Main 
{
public static void main(String[] args)
{
CarSales sys = new CarSales();
sys.run();
}
}

最佳答案

如果你自己创建一个对象,那么容​​器就没有机会执行注入(inject)。在客户端容器中,实际上只有主类才有资格注入(inject)。尝试:

public class Main 
{
@EJB
private static CarRepository carRepo;

public static void main(String[] args)
{
CarSales sys = new CarSales(carRepo);
sys.run();
}
}

public class CarSales
{
private final CarRepository carRepo;
private final MainScreen main;

public CarSales(CarRepository carRepo)
{
this.carRepo = carRepo;
main = new MainScreen();
}

或者,您可以在主类中声明引用,然后从客户端应用程序中的任何位置查找 EJB 引用:

@EJB(name="ejb/carRepo", beanInterface=CarRepository.clas)
public class Main
{
public static void main(String[] args)

...
CarRepository carRepo = (CarRepository)new InitialContext().lookup("java:comp/env/ejb/carRepo");

关于java - 无状态 EJB 在企业应用程序客户端中抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33367725/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com