Java 将EJB从2.1更改为3.0
我有一个现有的Web应用程序(Servlet),可以远程访问当前写入EJB2.1规范的EJB(Java 将EJB从2.1更改为3.0,java,jakarta-ee,ejb,weblogic,ejb-3.0,Java,Jakarta Ee,Ejb,Weblogic,Ejb 3.0,我有一个现有的Web应用程序(Servlet),可以远程访问当前写入EJB2.1规范的EJB(EJBHome,EJBObject,SessionBean,所有配置都在EJB jar.xml中)。servlet通过JNDI查找访问EJB,JNDI名称在weblogic EJB jar.xml中指定 我想将EJB更新为EJB3.0,这将(希望)使添加到API更容易 我的问题是,我需要对现有servlet代码进行最少的更改。换句话说,我仍然需要: 使用简单的全局JNDI名称访问EJB(它存储在数据库中
EJBHome
,EJBObject
,SessionBean
,所有配置都在EJB jar.xml
中)。servlet通过JNDI查找访问EJB,JNDI名称在weblogic EJB jar.xml
中指定
我想将EJB更新为EJB3.0,这将(希望)使添加到API更容易
我的问题是,我需要对现有servlet代码进行最少的更改。换句话说,我仍然需要:
String jndiName = getJndiName(); // e.g. "BeanV2.0"
BeanHome home = (BeanHome) PortableRemoteObject.narrow(
jndiContext.lookup(jndiName), BeanHome.class);
BeanRemote remote = home.create();
remote.doBusiness(); // call business method
@RemoteHome
,但在部署过程中不断出现错误
我正在Weblogic上部署(用于开发/生产),主要是10.3.5(11gR1),并且仅限于EJB3.0。我正在使用Eclipse(与OracleWebLogicPack一起)进行开发
谢谢。我建议您首先了解EJB2.1和EJB3.x之间的架构差异(请参阅) 由于删除了EJB3.x中的
Home
和Deployment Descriptor
,您将根据bean实现和客户端调用对代码进行一些主要/次要的更改
请参考本例,了解如何从客户机(在您的示例中是Servlet)访问EJB3.x
/**
* Servlet implementation class SampleServlet
*/
public class SampleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public SampleServlet() {
super();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
Context ctx=getInitialContext();
String jndiName=getJndiName(); // eg. java:global/BeanProject/Bean!demo.BeanRemote
BeanRemote beanRemote = (BeanRemote)ctx.lookup(jndiName);
remote.doBusiness();
} catch(Exception exception) {
System.out.println(exception.getMessage());
}
}
private static Context getInitialContext() throws Exception
{
Properties properties=new Properties();
properties.put("java.naming.factory.initial","org.jboss.naming.remote.client.InitialContextFactory");
properties.put("java.naming.provider.url","remote://localhost:4447");
return new InitialContext(properties);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
希望这有帮助 我建议您首先了解EJB2.1和EJB3.x之间的架构差异(请参阅) 由于删除了EJB3.x中的
Home
和Deployment Descriptor
,您将根据bean实现和客户端调用对代码进行一些主要/次要的更改
请参考本例,了解如何从客户机(在您的示例中是Servlet)访问EJB3.x
/**
* Servlet implementation class SampleServlet
*/
public class SampleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public SampleServlet() {
super();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
Context ctx=getInitialContext();
String jndiName=getJndiName(); // eg. java:global/BeanProject/Bean!demo.BeanRemote
BeanRemote beanRemote = (BeanRemote)ctx.lookup(jndiName);
remote.doBusiness();
} catch(Exception exception) {
System.out.println(exception.getMessage());
}
}
private static Context getInitialContext() throws Exception
{
Properties properties=new Properties();
properties.put("java.naming.factory.initial","org.jboss.naming.remote.client.InitialContextFactory");
properties.put("java.naming.provider.url","remote://localhost:4447");
return new InitialContext(properties);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
希望这有帮助 我建议您首先了解EJB2.1和EJB3.x之间的架构差异(请参阅) 由于删除了EJB3.x中的
Home
和Deployment Descriptor
,您将根据bean实现和客户端调用对代码进行一些主要/次要的更改
请参考本例,了解如何从客户机(在您的示例中是Servlet)访问EJB3.x
/**
* Servlet implementation class SampleServlet
*/
public class SampleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public SampleServlet() {
super();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
Context ctx=getInitialContext();
String jndiName=getJndiName(); // eg. java:global/BeanProject/Bean!demo.BeanRemote
BeanRemote beanRemote = (BeanRemote)ctx.lookup(jndiName);
remote.doBusiness();
} catch(Exception exception) {
System.out.println(exception.getMessage());
}
}
private static Context getInitialContext() throws Exception
{
Properties properties=new Properties();
properties.put("java.naming.factory.initial","org.jboss.naming.remote.client.InitialContextFactory");
properties.put("java.naming.provider.url","remote://localhost:4447");
return new InitialContext(properties);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
希望这有帮助 我建议您首先了解EJB2.1和EJB3.x之间的架构差异(请参阅) 由于删除了EJB3.x中的
Home
和Deployment Descriptor
,您将根据bean实现和客户端调用对代码进行一些主要/次要的更改
请参考本例,了解如何从客户机(在您的示例中是Servlet)访问EJB3.x
/**
* Servlet implementation class SampleServlet
*/
public class SampleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public SampleServlet() {
super();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
Context ctx=getInitialContext();
String jndiName=getJndiName(); // eg. java:global/BeanProject/Bean!demo.BeanRemote
BeanRemote beanRemote = (BeanRemote)ctx.lookup(jndiName);
remote.doBusiness();
} catch(Exception exception) {
System.out.println(exception.getMessage());
}
}
private static Context getInitialContext() throws Exception
{
Properties properties=new Properties();
properties.put("java.naming.factory.initial","org.jboss.naming.remote.client.InitialContextFactory");
properties.put("java.naming.provider.url","remote://localhost:4447");
return new InitialContext(properties);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
希望这有帮助 通过此链接,更改很少,但取决于您的代码设计@阿维纳什:我已经看到了这个链接。文章说,DeMichiel在EJB3.0上的2005 JavaOne2005演示中展示了一个示例。不幸的是,我将该演示文稿的所有链接都指向developers.sun.com,它将转发到Oracle Java主页:-(.在Oracle网站上搜索这篇文章给了我一些博客条目,所有这些条目都指向旧的Sun网站。有什么线索可以找到这篇文章吗?通过这个链接,变化很小,但取决于你的代码设计。@Avinash K.P:我已经看到了这个链接。文章说DeMichiel在2005 Java One 2005 P中给出了一个例子EJB3.0上的演示文稿。不幸的是,我将指向该演示文稿的所有链接都指向developers.sun.com,它将转发到Oracle Java主页:-(.在Oracle网站上搜索这篇文章给了我一些博客条目,所有这些条目都指向旧的Sun网站。有什么线索可以找到这篇文章吗?通过这个链接,变化很小,但取决于你的代码设计。@Avinash K.P:我已经看到了这个链接。文章说DeMichiel在2005 Java One 2005 P中给出了一个例子EJB3.0上的演示文稿。不幸的是,我将指向该演示文稿的所有链接都指向developers.sun.com,它将转发到Oracle Java主页:-(.在Oracle网站上搜索这篇文章给了我一些博客条目,所有这些条目都指向旧的Sun网站。有什么线索可以找到这篇文章吗?通过这个链接,变化很小,但取决于你的代码设计。@Avinash K.P:我已经看到了这个链接。文章说DeMichiel在2005 Java One 2005 P中给出了一个例子对EJB3.0的不满。不幸的是,我将所有指向developers.sun.com的链接都链接到了developers.sun.com,它会转发到Oracle Java主页:(。在Oracle网站上搜索文章会给我提供博客条目,所有这些条目都指向旧的sun网站。这些天在哪里可以找到那篇文章?谢谢,@Adheep。我通读了(差不多)整个EJB3.0(和3.1)规范,并同时实现了2.1和3.0bean,所以我理解其中的区别。我知道访问EJB的新(3.0)方法;我正在尝试以不需要对客户端进行任何更改的方式重写EJB,至少不需要立即进行更改。(我可能希望在将来缓慢地更新客户端,但我无法在可用的时间范围内完成所有更新。)@梅纳赫姆,是的,我可以理解你的问题,但我相信你现在已经明白,如果不在客户端进行更改,你就无法迁移到EJB3.x。但是我有一个建议,你可以在2.1中实现一个通用的代理ejb,它唯一的工作就是调用一个3.x ejb并将响应返回给客户端,实际上是@Adheep,3.0规范(简化)确实提到了这样做的方法,建议使用
@RemoteHome
注释主界面。但是,我找不到任何有效的示例。jboss有一个EJB3教程,其中包括一个示例,但我无法将其部署到Weblogic上。谢谢,@Adheep。我(几乎)通读了整个EJB3.0(和3.1)sp