java.lang.ClassCastException:com.sun.proxy。在转换EJB时抛出代理 [英] java.lang.ClassCastException: com.sun.proxy.$Proxy is thrown when casting an EJB
问题描述
UserViewBeanRemote.java
package books.pointejb;
import java.util.List;
import javax.ejb.Remote;
import books.pointejb.User;
import books.pointejb.Book;
@Remote
public interface UserViewBeanRemote {
public boolean register(User user);
//用户可以删除他/她的帐号,请注意,两个用户名相同的用户名不能存在
public void delete(User user);
public boolean login(User user);
public boolean logout(User user);
//仅通过书名搜索
public List< Book> search(String title);
}
UserViewBean.java
package books.pointejb;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.ejb.Stateful;
import javax.management.Query;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
// import javax.ejb.Remote;
import books.pointejb.User;
import books.pointejb.Book;
/ **
*会话Bean实现类UserView
* /
@Stateful
// @Remote(UserViewBeanRemote.class)
public class UserViewBean implements UserViewBeanRemote {
@PersistenceContext
private EntityManager entityManager;
/ **
*默认构造函数。
* /
public UserViewBean(){
// TODO自动生成的构造函数存根
}
public static< T>列表与LT; T> castList(Class<?extends T> clazz,Collection<?> c){
列表< T> r = new ArrayList< T>(c.size());
for(Object o:c)
r.add(clazz.cast(o));
return r;
}
@Override
public boolean register(User user){
//我们有一些验证这些字段的servlet,所以我们不会在这里验证任何东西b $ b //我们检查是否已经有一个具有相同用户名的用户
Query query =(Query)entityManager.createQuery(SELECT u FROM users u WHERE u.username =:userName );
((javax.persistence.Query)query).setParameter(userName,user.getUsername());
//我们检查每个返回的值。如果我们找到任何东西,我们不添加用户
列表< User> users = castList(User.class,((javax.persistence.Query)query).getResultList());
if(users.isEmpty()){
//用户不存在。添加此用户
entityManager.persist(user);
// returnWelcome to BooksPoint+ user.getUsername()+!;
返回true;
} else {
// return无法创建+ user.getUsername()+。具有此名称的用户已存在;
返回false;
}
}
@Override
public void delete(User user){
//该用户自动存在,因为用户是已经登录
查询查询=(查询)entityManager.createQuery(DELETE FROM users u WHERE u.username =:userName);
((javax.persistence.Query)query).setParameter(userName,user.getUsername());
//返回您的帐户+ user.getUsername()+已成功删除!;
}
@Override
public boolean login(User user){
//检查我们是否有一个有效的用户/通过对
查询查询= (Query)entityManager.createQuery(SELECT u FROM users u WHERE u.username =:userName AND u.password =:password);
((javax.persistence.Query)query).setParameter(userName,user.getUsername());
((javax.persistence.Query)query).setParameter(password,user.getPassword());
列表<用户> users = castList(User.class,((javax.persistence.Query)query).getResultList());
if(!users.isEmpty()){
// returnWelcome+ user.getUsername()+!;
返回true;
} else {
//返回用户名或密码无效;
返回false;
}
}
@Override
public boolean logout(User user){
//这可以在jsp / servlet中完成。只需擦除与当前用户关联的会话变量
return false;
}
@Override
public List< Book> search(String title){
//检查所有条目类似于title
的查询查询=(Query)entityManager.createQuery(SELECT * FROM books WHERE title LIKE'%:title%') ;
((javax.persistence.Query)query).setParameter(title,title);
列表< Book> books = castList(Book.class,((javax.persistence.Query)query).getResultList());
//返回书籍,剩下的就是jsp
返回书;
}
}
取消注释 @Remote(UserViewBeanRemote.class) 不会更改此行为。
查找在以下文件中完成:
Lookup.java
package books.point;
import javax.naming.Context;
import javax.naming.NamingException;
import books.point.clientutility.ClientUtility;
import books.pointejb.CartBean;
import books.pointejb.CartBeanRemote;
import books.pointejb.UserViewBean;
import books.pointejb.UserViewBeanRemote;
public class Lookup {
private static final String MODULE_NAME =BooksPointEJB;
public static UserViewBean doLookupUser(){
Context context = null;
UserViewBean bean = null;
try {
// 1.获取上下文
context = ClientUtility.getInitialContext();
// 2.生成JNDI查找名称
String lookupName = getLookupNameUser();
// 3.查找和转换
bean =(UserViewBean)context.lookup(lookupName); //< ==异常抛出此处
} catch(NamingException e){
e.printStackTrace();
}
返回bean;
}
public static String getLookupNameUser(){
/ *
*应用程序名称是没有.ear后缀的部署EJB的EAR名称。
*由于我们没有将应用程序部署为.ear,因此
* us的应用程序名称将为空字符串
* /
String appName =;
/ *
*模块名称是没有.jar
*后缀的部署EJB的JAR名称。
* /
String moduleName = MODULE_NAME;
/ *
* AS7允许每个部署具有(可选)不同的名称。如果未指定不同的名称,则
*可以是空字符串。
* /
String distinctName =;
// EJB bean实现类名称
String beanName = UserViewBean.class.getSimpleName();
//完全限定的远程接口名称
final String interfaceName = UserViewBeanRemote.class.getName();
//创建一个查询字符串名称
//在结尾的状态标志非常小心
String name =ejb:+ appName +/+ moduleName +/+ distinctName
+/+ beanName +! + interfaceName +?stateful;
//用户查找名称:ejb:/ BooksPointEJB // UserViewBean!books.pointejb.UserViewBeanRemote? stateful
System.out.println(User Lookup name is:+ name);
返回名称;
}
...
pre>
}
EJB部署日志是:
12:10: 22,897 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor](MSC服务线程1-5)部署单元部署中名为UserViewBean的会话bean的JNDI绑定BooksPoint.war如下:
java:global / BooksPoint / UserViewBean!books.pointejb.UserViewBeanRemote
java:app / BooksPoint / UserViewBean!books.pointejb.UserViewBeanRemote
java:module / UserViewBean!books.pointejb.UserViewBeanRemote
java:jboss / exports / BooksPoint / UserViewBean!books.pointejb.UserViewBeanRemote
java:global / BooksPoint / UserViewBean
java:app / BooksPoint / UserViewBean
java:module / UserViewBean
我正在使用jboss-as-7.1.1.Final。为什么会抛出这个异常?
12:10:52,973 INFO [org.jboss.ejb.client](http-localhost- 127.0.0.1-8080-1)JBoss EJB Client版本1.0.5.Final
12:10:53,043 ERROR [org.apache.catalina.core.ContainerBase。[jboss.web]。[default-host]。 [/BooksPoint].[books.point.Register]](http-localhost-127.0.0.1-8080-1)Servlet.service()为servlet books.point.Register抛出异常:java.lang.ClassCastException:com.sun .proxy。$ Proxy22不能被转换为books.pointejb.UserViewBean
在books.point.Lookup.doLookupUser(Lookup.java:24)[classes:]
at books.point.Register.doPost( Register.java:263)[classes:]
在javax.servlet.http.HttpServlet.service(HttpServlet.java:754)[jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0。 0.Final]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)[jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain .java:329)[jbossweb-7.0.13.Final.jar:]
在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)[jbossweb-7.0.13.Final.jar :]
在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275)[jbossweb-7.0.13.Final.jar:]
在org.apache.catalina.core。 StandardContextValve.invoke(StandardContextValve.java:161)[jbossweb-7.0.13.Final.jar:]
在org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50)[jboss- as-jpa-7.1.1.Final.jar:7.1.1.Final]
在org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153)[jboss-as-web- 7.1.1.Final.jar:7.1.1.Final]
在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155)[jbossweb-7.0.13.Final.jar:]
在org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)[jbossweb-7.0.13.Final.jar:]
在org.apache.catalina.cor e.StandardEngineValve.invoke(StandardEngineValve.java:109)[jbossweb-7.0.13.Final.jar:]
在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368)[jbossweb- 7.0.13.Final.jar:]
在org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)[jbossweb-7.0.13.Final.jar:]
在org .apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:671)[jbossweb-7.0.13.Final.jar:]
在org.apache.tomcat.util.net.JIoEndpoint $ Worker。 run(JIoEndpoint.java:930)[jbossweb-7.0.13.Final.jar:]
java.lang.Thread.run(Unknown Source)[rt.jar:1.7.0_45]
解决方案当您进行JNDI查找时,您将查找远程接口。 >
所以将你的演员更改为
bean =(UserViewBeanRemote)context.lookup lookupName);
应该做的伎俩。
I am having trouble using remote EJB objects. JNDI look-up succeeds but casting to an object and later usage fails. The EJB interface and implementation are as follows:
UserViewBeanRemote.java
package books.pointejb; import java.util.List; import javax.ejb.Remote; import books.pointejb.User; import books.pointejb.Book; @Remote public interface UserViewBeanRemote { public boolean register(User user); // A user can delete his/her account, note that two users with the same username cannot exist public void delete(User user); public boolean login(User user); public boolean logout(User user); // Search only by book titles public List<Book> search(String title); }
UserViewBean.java
package books.pointejb; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.ejb.Stateful; import javax.management.Query; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; // import javax.ejb.Remote; import books.pointejb.User; import books.pointejb.Book; /** * Session Bean implementation class UserView */ @Stateful // @Remote(UserViewBeanRemote.class) public class UserViewBean implements UserViewBeanRemote { @PersistenceContext private EntityManager entityManager; /** * Default constructor. */ public UserViewBean() { // TODO Auto-generated constructor stub } public static <T> List<T> castList(Class<? extends T> clazz, Collection<?> c) { List<T> r = new ArrayList<T>(c.size()); for(Object o: c) r.add(clazz.cast(o)); return r; } @Override public boolean register(User user) { // We have servlets that validate these fields, so we don't validate anything here // We check to see whether there is already a user with the same user name or not Query query = (Query) entityManager.createQuery("SELECT u FROM users u WHERE u.username=:userName"); ((javax.persistence.Query) query).setParameter("userName", user.getUsername()); // We check each returned value. If we find anything than we do not add the user List<User> users = castList(User.class, ((javax.persistence.Query) query).getResultList()); if(users.isEmpty()) { // The user is not present. Add this user entityManager.persist(user); // return "Welcome to BooksPoint " + user.getUsername() + "!"; return true; } else { // return "Cannot create " + user.getUsername() + ". A user with this name already exists"; return false; } } @Override public void delete(User user) { // The account automatically exists since the user is already logged in Query query = (Query) entityManager.createQuery("DELETE FROM users u WHERE u.username=:userName"); ((javax.persistence.Query) query).setParameter("userName", user.getUsername()); // return "Your account " + user.getUsername() + " has been removed successfully!"; } @Override public boolean login(User user) { // Check if we have a valid user/pass pair Query query = (Query) entityManager.createQuery("SELECT u FROM users u WHERE u.username=:userName AND u.password=:password"); ((javax.persistence.Query) query).setParameter("userName", user.getUsername()); ((javax.persistence.Query) query).setParameter("password", user.getPassword()); List<User> users = castList(User.class, ((javax.persistence.Query) query).getResultList()); if(!users.isEmpty()) { // return "Welcome " + user.getUsername() + "!"; return true; } else { // return "Username or password are not valid"; return false; } } @Override public boolean logout(User user) { // This can be done in the jsp/servlet. Simply erase the session variables associated with the current user return false; } @Override public List<Book> search(String title) { // Check all entries for names similar to title Query query = (Query) entityManager.createQuery("SELECT * FROM books WHERE title LIKE '%:title%'"); ((javax.persistence.Query) query).setParameter("title", title); List<Book> books = castList(Book.class, ((javax.persistence.Query) query).getResultList()); // Return the books now leave the rest to the jsp return books; } }
Uncommenting @Remote(UserViewBeanRemote.class) doesn't change this behavior. The lookup is done in the following file:
Lookup.java
package books.point; import javax.naming.Context; import javax.naming.NamingException; import books.point.clientutility.ClientUtility; import books.pointejb.CartBean; import books.pointejb.CartBeanRemote; import books.pointejb.UserViewBean; import books.pointejb.UserViewBeanRemote; public class Lookup { private static final String MODULE_NAME = "BooksPointEJB"; public static UserViewBean doLookupUser() { Context context = null; UserViewBean bean = null; try { // 1. Obtaining Context context = ClientUtility.getInitialContext(); // 2. Generate JNDI Lookup name String lookupName = getLookupNameUser(); // 3. Lookup and cast bean = (UserViewBean) context.lookup(lookupName); // <== Exception is thrown here } catch (NamingException e) { e.printStackTrace(); } return bean; } public static String getLookupNameUser() { /* * The app name is the EAR name of the deployed EJB without .ear suffix. * Since we haven't deployed the application as a .ear, the app name for * us will be an empty string */ String appName = ""; /* * The module name is the JAR name of the deployed EJB without the .jar * suffix. */ String moduleName = MODULE_NAME; /* * AS7 allows each deployment to have an (optional) distinct name. This * can be an empty string if distinct name is not specified. */ String distinctName = ""; // The EJB bean implementation class name String beanName = UserViewBean.class.getSimpleName(); // Fully qualified remote interface name final String interfaceName = UserViewBeanRemote.class.getName(); // Create a look up string name // Be very careful about the stateful flag at the end String name = "ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + interfaceName + "?stateful";
// User looked up name: ejb:/BooksPointEJB//UserViewBean!books.pointejb.UserViewBeanRemote?stateful System.out.println("User Lookup name is: " + name); return name; }
... }
The EJB deployment log is:
12:10:22,897 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-5) JNDI bindings for session bean named UserViewBean in deployment unit deployment "BooksPoint.war" are as follows: java:global/BooksPoint/UserViewBean!books.pointejb.UserViewBeanRemote java:app/BooksPoint/UserViewBean!books.pointejb.UserViewBeanRemote java:module/UserViewBean!books.pointejb.UserViewBeanRemote java:jboss/exported/BooksPoint/UserViewBean!books.pointejb.UserViewBeanRemote java:global/BooksPoint/UserViewBean java:app/BooksPoint/UserViewBean java:module/UserViewBean
I am using jboss-as-7.1.1.Final. Why is this exception thrown?
12:10:52,973 INFO [org.jboss.ejb.client] (http-localhost-127.0.0.1-8080-1) JBoss EJB Client version 1.0.5.Final 12:10:53,043 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/BooksPoint].[books.point.Register]] (http-localhost-127.0.0.1-8080-1) Servlet.service() for servlet books.point.Register threw exception: java.lang.ClassCastException: com.sun.proxy.$Proxy22 cannot be cast to books.pointejb.UserViewBean at books.point.Lookup.doLookupUser(Lookup.java:24) [classes:] at books.point.Register.doPost(Register.java:263) [classes:] at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final] at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:] at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final] at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:] at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:] at java.lang.Thread.run(Unknown Source) [rt.jar:1.7.0_45]
解决方案When you do a JNDI lookup, you lookup the remote Interface.
so changing your cast to
bean = (UserViewBeanRemote) context.lookup(lookupName);
should do the trick.
这篇关于java.lang.ClassCastException:com.sun.proxy。在转换EJB时抛出代理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!