在使用EJB和Tomee时,有没有人遇到过这类问题:
SEVERE:Servlet [rs.ac.uns.ftn.informatika.mbs2.vezbe09.primer01.server.servlet.LoginController]的Servlet.service()在路径[/ Vezbe09]的上下文中引发了异常 javax.ejb.EJBException:bean遇到了非应用程序异常;嵌套异常是: org.apache.openjpa.persistence.PersistenceException:rs.ac.uns.ftn.informatika.mbs2.vezbe09.primer01.server.entity.Korisnik无法强制转换为rs.ac.uns.ftn.informatika.mbs2.vezbe09.primer01 .server.entity.Jelovnik FailedObject:SELECT je FROM Jelovnik je [java.lang.String] at org.apache.openejb.core.ivm.BaseEjbProxyHandler.convertException(BaseEjbProxyHandler.java:363) at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:283) 在com.sun.proxy。$ Proxy89.sviJelovnici(未知来源) 在rs.ac.uns.ftn.informatika.mbs2.vezbe09.primer01.server.servlet.LoginController.doGet(LoginController.java:80) 在rs.ac.uns.ftn.informatika.mbs2.vezbe09.primer01.server.servlet.LoginController.doPost(LoginController.java:143) 在javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 在javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 在org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45) 在org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 在org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 在org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 在org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002) at org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:585) at org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:312) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615) 在java.lang.Thread.run(Thread.java:745)
好的,这是 LoginController servlet:
@WebServlet("/LoginController")
public class LoginController extends HttpServlet {
private static final long serialVersionUID = 1L;
@EJB
private KorisnikDaoLocal korisnikDao;
@EJB
private JeloDaoLocal jeloDao;
@EJB
private JelovnikDaoLocal jelovnikDao;
@EJB
private RestoranDaoLocal restoranDao;
@EJB
private RezervacijaDaoLocal rezervacijaDao;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
try {
String korisnickoIme = null;
String lozinka = null;
if((!request.getParameter("kime").equals("")) && (request.getParameter("kime") != null))
{
korisnickoIme = request.getParameter("kime");
}
if((!request.getParameter("kpass").equals("")) && (request.getParameter("kpass") != null))
{
lozinka = request.getParameter("kpass");
}
if ((korisnickoIme == null) || (korisnickoIme.equals("")) || (lozinka == null) || (lozinka.equals(""))) {
response.sendRedirect(response.encodeRedirectURL("loginGreska.jsp"));
return;
}
Korisnik korisnik = korisnikDao.findKorisnikSaKorisnickimImenomILozinkom(korisnickoIme, lozinka);
if (korisnik != null)
{
if(korisnik.getKorisnikVrsta().equals("a"))
{
HttpSession session = request.getSession(true);
session.setAttribute("admin", korisnik);
session.setAttribute("prijatelji", korisnikDao.findPrijatelje(korisnik.getId()));
session.setAttribute("sviMenadzeri", korisnikDao.sviMenadzeri("m"));
session.setAttribute("restorani", restoranDao.sviRestorani());
session.setAttribute("sviJelovnici", jelovnikDao.sviJelovnici());
request.getRequestDispatcher("./glavnaStrana.jsp").forward(request, response);
}
else if(korisnik.getKorisnikVrsta().equals("m"))
{
HttpSession session = request.getSession(true);
session.setAttribute("menadzer", korisnik);
session.setAttribute("prijatelji", korisnikDao.findPrijatelje(korisnik.getId()));
session.setAttribute("jelo", jeloDao.findJelovnik(korisnik.getRestoran().getId()));
session.setAttribute("jelovniciRestorana", jelovnikDao.findJelovnikRestorana(korisnik.getRestoran().getId()));
request.getRequestDispatcher("./glavnaStrana.jsp").forward(request, response);
}
else if(korisnik.getKorisnikVrsta().equals("g") && korisnik.getKorisnikPotvrda())
{
HttpSession session = request.getSession(true);
session.setAttribute("gost", korisnik);
session.setAttribute("prijatelji", korisnikDao.findPrijatelje(korisnik.getId()));
session.setAttribute("restorani", restoranDao.sviRestorani());
session.setAttribute("gostRezervacije", rezervacijaDao.findRezervacije(korisnik.getId()));
session.setAttribute("sveReze", rezervacijaDao.findAll());
session.setAttribute("gostVazeceRez", korisnik.vazeceRez(rezervacijaDao.findRezervacije(korisnik.getId())));
session.setAttribute("gostNeVazeceRez", korisnik.neVazeceRez(rezervacijaDao.findRezervacije(korisnik.getId())));
request.getRequestDispatcher("./glavnaStrana.jsp").forward(request, response);
}
else
{
response.sendRedirect("loginGreska.jsp");
return;
}
}
else
{
response.sendRedirect("loginGreska.jsp");
return;
}
} catch (EJBException e) {
if (e.getCause().getClass().equals(NoResultException.class)) {
response.sendRedirect(response.encodeRedirectURL("loginGreska.jsp"));
} else {
e.printStackTrace();
throw e;
}
} catch (ServletException e) {
throw e;
} catch (IOException e) {
throw e;
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
以下是 Korisnik 和 Jelovnik 的权利:
@Entity
@Table(name = "korisnik")
public class Korisnik implements Serializable {
private static final long serialVersionUID = 3770759786667844735L;
@Id
@GeneratedValue(strategy = IDENTITY) // ovde je onaj AUTO_INCREMENT
@Column(name = "korisnik_id", unique = true, nullable = false)
private Integer id;
@Column(name = "korisnik_korisnicko_ime", unique = true, nullable = false)
private String korisnickoImeKorisnika;
@Column(name = "korisnik_lozinka", unique = false, nullable = false)
private String lozinkaKorisnika;
@Column(name = "korisnik_vrsta", unique = false, nullable = false)
private String korisnikVrsta;
@Column(name = "korisnik_ime", unique = false, nullable = false)
private String korisnikIme;
@Column(name = "korisnik_prezime", unique = false, nullable = false)
private String korisnikPrezime;
@Column(name = "korisnik_slika", unique = false, nullable = true)
private String korisnikSlika;
@Column(name = "korisnik_potvrda", unique = false, nullable = true)
private Boolean korisnikPotvrda;
@ManyToOne
@JoinColumn(name = "restoran_id", referencedColumnName = "restoran_id", nullable = true)
private Restoran restoran;
@OneToMany(cascade = { ALL }, fetch = FetchType.EAGER, mappedBy = "gost")
private List<Rezervacija> rezervacije = new ArrayList<Rezervacija>();
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "prijatelji",
joinColumns =
@JoinColumn(name = "prijatelj1", referencedColumnName = "korisnik_id"),
inverseJoinColumns =
@JoinColumn(name = "prijatelj2", referencedColumnName = "korisnik_id"))
private List<Korisnik> prijateljiLista = new ArrayList<Korisnik>();
@ManyToMany(mappedBy="pozvaniPrijatelji", fetch = FetchType.EAGER)
private List<Rezervacija> rezervacijePrijatelji = new ArrayList<Rezervacija>();
public List<Rezervacija> getRezervacijePrijatelji() {
return rezervacijePrijatelji;
}
public void setRezervacijePrijatelji(List<Rezervacija> rezervacijePrijatelji) {
this.rezervacijePrijatelji = rezervacijePrijatelji;
}
public Boolean getKorisnikPotvrda() {
return korisnikPotvrda;
}
public void setKorisnikPotvrda(Boolean korisnikPotvrda) {
this.korisnikPotvrda = korisnikPotvrda;
}
public List<Rezervacija> getRezervacije() {
return rezervacije;
}
public void setRezervacije(List<Rezervacija> rezervacije) {
this.rezervacije = rezervacije;
}
public Restoran getRestoran() {
return restoran;
}
public void setRestoran(Restoran restoran) {
this.restoran = restoran;
}
public List<Korisnik> getPrijateljiLista() {
return prijateljiLista;
}
public void setPrijateljiLista(List<Korisnik> prijateljiLista) {
this.prijateljiLista = prijateljiLista;
}
public String getKorisnikSlika() {
return korisnikSlika;
}
public void setKorisnikSlika(String korisnikSlika) {
this.korisnikSlika = korisnikSlika;
}
public String getKorisnikIme() {
return korisnikIme;
}
public void setKorisnikIme(String korisnikIme) {
this.korisnikIme = korisnikIme;
}
public String getKorisnikPrezime() {
return korisnikPrezime;
}
public void setKorisnikPrezime(String korisnikPrezime) {
this.korisnikPrezime = korisnikPrezime;
}
public String getKorisnikVrsta() {
return korisnikVrsta;
}
public void setKorisnikVrsta(String korisnikVrsta) {
this.korisnikVrsta = korisnikVrsta;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getKorisnickoImeKorisnika() {
return korisnickoImeKorisnika;
}
public void setKorisnickoImeKorisnika(String korisnickoImeKorisnika) {
this.korisnickoImeKorisnika = korisnickoImeKorisnika;
}
public String getLozinkaKorisnika() {
return lozinkaKorisnika;
}
public void setLozinkaKorisnika(String lozinkaKorisnika) {
this.lozinkaKorisnika = lozinkaKorisnika;
}
public Korisnik() {
super();
}
public Korisnik(String korisnickoImeKorisnika,
String lozinkaKorisnika, String korisnikVrsta, String korisnikIme,
String korisnikPrezime, String korisnikSlika, Boolean korisnikPotvrda) {
super();
this.korisnickoImeKorisnika = korisnickoImeKorisnika;
this.lozinkaKorisnika = lozinkaKorisnika;
this.korisnikVrsta = korisnikVrsta;
this.korisnikIme = korisnikIme;
this.korisnikPrezime = korisnikPrezime;
this.korisnikSlika = korisnikSlika;
this.korisnikPotvrda = korisnikPotvrda;
}
@Entity
@Table(name = "jelovnik")
@NamedQueries({
@NamedQuery(name = "findJelovnikRestorana", query = "SELECT je FROM Jelovnik je JOIN je.jelovnikRestorani jer WHERE jer.id= :IDRestoran"),
@NamedQuery(name = "sviJelovnici", query = "SELECT je FROM Jelovnik je"),
public class Jelovnik implements Serializable
{
@Id
@Column(name = "jelovnik_id", unique = true, nullable = false)
private Integer id;
@OneToMany(cascade = { ALL }, fetch = FetchType.EAGER, mappedBy = "jelovnik")
private List<Restoran> jelovnikRestorani = new ArrayList<Restoran>();
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name="Jelo_za_jelovnike",
joinColumns=@JoinColumn(name="jelovnik_id"),
inverseJoinColumns=@JoinColumn(name="jelo_id"))
private List<Jelo> razlicitaHrana = new ArrayList<Jelo>();
public Jelovnik(Integer id) {
super();
this.id = id;
}
public Jelovnik()
{
super();
}
public void addJelo(Jelo j)
{
if(razlicitaHrana.contains(j))
{
return;
}
razlicitaHrana.add(j);
}
public void removeJelo(Jelo j)
{
for(int i=0; i<this.getRazlicitaHrana().size(); i++)
{
if(j.getId().equals(this.getRazlicitaHrana().get(i).getId()))
{
razlicitaHrana.remove(i);
break;
}
}
for(int b=0; b<j.getHranaJelovnici().size(); b++)
{
if(j.getHranaJelovnici().get(b).getId().equals(this.getId()))
{
j.getHranaJelovnici().remove(b);
break;
}
}
}
public void addRestoran(Restoran res)
{
if(jelovnikRestorani.contains(res))
{
return;
}
jelovnikRestorani.add(res);
}
public void removeRestoran(Restoran res)
{
jelovnikRestorani.remove(res);
}
public List<Jelo> getRazlicitaHrana() {
return razlicitaHrana;
}
public void setRazlicitaHrana(List<Jelo> razlicitaHrana) {
this.razlicitaHrana = razlicitaHrana;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
这是导致异常的DAOBean:
@Stateless
@Local(JelovnikDaoLocal.class)
public class JelovnikDaoBean extends GenericDaoBean<Jelovnik, Integer> implements JelovnikDaoLocal
{
public Jelovnik findJelovnikRestorana(Integer idRestoran)
{
return (Jelovnik) em.createNamedQuery("findJelovnikRestorana").setParameter("IDRestoran", idRestoran).getSingleResult();
}
public List<Jelovnik> sviJelovnici()
{
return (List<Jelovnik>) em.createNamedQuery("sviJelovnici").getResultList();
}
public Jelovnik jelovnikSifra(Integer IDJelovnik)
{
return (Jelovnik) em.createNamedQuery("jelovnikSifra").setParameter("IDJelovnik", IDJelovnik).getSingleResult();
}
}
这是MDB类:
@MessageDriven(
activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "PaymentQueue")
}
)
public class KorisnikBean implements MessageListener
{
@Resource(name="Mail")
Session session;
public KorisnikBean()
{
}
public void onMessage(Message arg0)
{
try {
if (arg0 instanceof ObjectMessage)
{
ObjectMessage obj = (ObjectMessage) arg0;
if(obj.getObject() instanceof Korisnik)
{
Korisnik gost = (Korisnik)obj.getObject();
sendMessage(gost);
}
else if(obj.getObject() instanceof Rezervacija)
{
Rezervacija rez = (Rezervacija)obj.getObject();
sendMessage2(rez);
}
}
else {
System.out.println("MESSAGE BEAN: Message of wrong type: " + arg0.getClass().getName());
}
} catch (JMSException e) {
e.printStackTrace();
} catch (Throwable te) {
te.printStackTrace();
}
}
public void sendMessage(Korisnik gost) throws AddressException, MessagingException
{
String link = "<q>localhost:8080/Vezbe09/PotvrdaRegistracijeController?sifraGost=" + gost.getId()+ "</q>";
String poruka = "Jos samo jedan korak vas deli do uspesne registracije."
+ "Kliknite na sledeci link da potvrdite registraciju:"
+ link;
javax.mail.Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("petaro738@gmail.com"));
msg.setRecipients(RecipientType.TO, InternetAddress.parse(gost.getKorisnickoImeKorisnika()));
msg.setSubject("Registracija");
msg.setContent(poruka, "text/html; charset=utf-8");
msg.setSentDate(new Date());
// Sends the message
Transport.send(msg);
System.out.println("MESSAGE BEAN: Mail was sent successfully.");
}
public void sendMessage2(Rezervacija rez) throws AddressException, MessagingException
{
for(int i=0; i<rez.getPozvaniPrijatelji().size(); i++)
{
String link = "<q>localhost:8080/Vezbe09/PotvrdaRezervacijeController?sifraGost=" + rez.getPozvaniPrijatelji().get(i).getId()+ "&sifraRez="+rez.getId() +"</q>";
String poruka = "Vas prijatelj <b>" + rez.getGost().getKorisnikIme() + " " + rez.getGost().getKorisnikPrezime() + "</b> vas je pozvao u restoran <b>" + rez.getRestoranRez().getNazivRestorana() + "</b>. "
+ "Datum rezervacije je: <b>" + rez.getDatumRezervacije().toString() + "</b>, dok je Vas sto sa brojem <b>" + rez.getStoRez().getId() + "</b>. <br/>"
+ "Kliknite na sledeci link da potvrdite rezervaciju:"
+ link;
javax.mail.Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("petaro738@gmail.com"));
msg.setRecipients(RecipientType.TO, InternetAddress.parse(rez.getPozvaniPrijatelji().get(i).getKorisnickoImeKorisnika()));
msg.setSubject("Pozivnica u restoran " + rez.getRestoranRez().getNazivRestorana());
msg.setContent(poruka, "text/html; charset=utf-8");
msg.setSentDate(new Date());
// Sends the message
Transport.send(msg);
System.out.println("MESSAGE BEAN: Mail was sent successfully.");
}
}
} 这就是它所谓的:
@Resource(name="JmsConnectionFactory")
private ConnectionFactory qcf;
@Resource(name="PaymentQueue")
private Queue paymentQueue;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
Connection connection = null;
Session session = null;
MessageProducer producer = null;
try {
// Creates a connection
connection = qcf.createConnection();
// Creates a session
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// Creates a message producer from the Session to the Topic or Queue
producer = session.createProducer(paymentQueue);
// Creates an object message
ObjectMessage object = session.createObjectMessage();
object.setObject(rezervacija);
// Tells the producer to send the object message
producer.send(object);
// Closes the producer
producer.close();
// Closes the session
session.close();
// Closes the connection
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
有趣的是,我做了几次相同的测试,4次中有3次可以正常工作,但有时只是拍摄并抛出异常我告诉你。 而且只是为了让你知道,我不会将任何实体投射到另一个实体上,显然不是bean Korisnik 到bean Jelovnik 。 一切正常,直到我使用MDB发送电子邮件。 在此之前一切都还好。 当我尝试使用DAO从mysql数据库获取数据时,它就会中断。 任何想法的人... Tnx。 :)