我正在使用Java EE应用程序的有状态会话bean方法来制作购物车。我的计划是在用户单击“结帐”按钮后,订单将被添加到数据库中。但是,订单不会在数据库中更新。
ShoppingCartFacade.java
@Stateful
public class ShoppingCartFacade implements ShoppingCartFacadeLocal {
@PersistenceContext(unitName = "DProject-ejbPU", type = PersistenceContextType.EXTENDED)
private EntityManager em;
private void create(Tickettable tickettable) {
em.persist(tickettable);
}
private ArrayList<Tickettable> ticketCart;
@PostConstruct
private void initializeBean(){
ticketCart = new ArrayList<>();
}
@Override
public boolean add(Tickettable tickettable) {
boolean result = false;
//Set the correct user and showtime table
tickettable.setUserid(this.getUsertableFrom(tickettable.getUserid().getUserid()));
tickettable.setShowtimeid(this.getShowtimetableFrom(tickettable.getShowtimeid().getShowtimeid()));
try {
//Already have ticket for this showtime
for (Tickettable ticket : ticketCart) {
if (ticket.getShowtimeid().getShowtimeid().equals(tickettable.getShowtimeid().getShowtimeid())) {
ticket.setQuantity(ticket.getQuantity() + tickettable.getQuantity());
result = true;
}
}
//New ticket
if (!result) {
ticketCart.add(tickettable);
result = true;
}
} catch (Exception ex) {
}
return result;
}
@Override
public ArrayList<Tickettable> getCart() {
return ticketCart;
}
@Override
public boolean checkOut() {
try {
for (Tickettable ticket : ticketCart) {
create(ticket);
}
ticketCart.clear();
return true;
} catch (Exception e) {
}
return false;
}
private Usertable getUsertableFrom(String userId) {
Usertable u = em.getReference(Usertable.class, userId);
return u;
}
private Showtimetable getShowtimetableFrom(String showtimeId) {
Showtimetable s = em.getReference(Showtimetable.class, showtimeId);
return s;
}
@Remove
public void remove() {
ticketCart = null;
}
}
ShoppingCartManagement.java
@Stateful
public class ShoppingCartManagement implements ShoppingCartManagementRemote {
@EJB
private ShoppingCartFacadeLocal shoppingCartFacade;
@Override
@PermitAll
public boolean add(TicketDTO ticketDTO) {
if (ticketDTO == null) {
// just in case
return false;
}
// convert to entity
Tickettable ticket = Utility.ticketDTO2Entity(ticketDTO);
// add one
return shoppingCartFacade.add(ticket);
}
@Override
@PermitAll
public ArrayList<TicketDTO> getCart() {
try {
ArrayList<Tickettable> alst = shoppingCartFacade.getCart();
if (alst.isEmpty()) {
//not found
return null;
} else {
ArrayList<TicketDTO> alsDTO = new ArrayList<>(alst.size());
for (Tickettable stt : alst) {
TicketDTO stDTO = Utility.ticketEntity2DTO(stt);
alsDTO.add(stDTO);
}
return alsDTO;
}
} catch (NullPointerException e) {
throw e;
}
}
@Override
@PermitAll
public boolean checkOut() {
return shoppingCartFacade.checkOut();
}
}
战争中的ShoppingCartManagedBean.java
@Named(value = "shoppingCartManagedBean")
@RequestScoped
public class ShoppingCartManagedBean implements Serializable{
.....
@EJB
private ShoppingCartManagementRemote shoppingCartManagement;
public String addTicket(){
this.quantity += 1;
UserDTO u = new UserDTO(userId,"","","","","");
ShowtimeDTO s = new ShowtimeDTO(showtimeId,"","","","","");
TicketDTO t = new TicketDTO("111111",u,s,Integer.toString(this.quantity));
//carts = shoppingCartManagement.getCart();
boolean result = shoppingCartManagement.add(t);
if(result){
return "success";
}
return "failure";
}
public String checkout(){
/*return shoppingCartManagement.checkOut();*/
boolean result = shoppingCartManagement.checkOut();
if(result) return "success";
return "failure";
}
}
************************更新******************** < / p>
我刚刚进行了测试。 ShoppingCartFacade.java 中的cartList为空。
答案 0 :(得分:0)
您需要了解所使用的各种bean的生命周期管理。
@Stateful
bean没有与servlet / JSF会话隐式关联。
将为每个传入的请求创建一个ShoppingCartManagedBean
的新实例,因为它是@RequestScoped
。此实例将自动获得对ShoppingCartManagement
的新实例的引用,而该引用又将得到对ShoppingCartFacade
的新实例的引用。
您需要:
将ShoppingCartManagedBean
更改为@SessionScoped
,或
创建一个@SessionScoped
门面,该门面委托给ShoppingCartManagement
参考,并将其插入EJB。
这两种方法均会将您的有状态会话bean与servlet / JSF会话相关联。