EJB3.0异常总结---javax.ejb.EJBException: Local and Remote Interfaces cannot have duplicate interface for...

本文详细介绍了在使用EJB技术开发应用时遇到的本地和远程接口冲突问题,并提供了解决方法,通过明确指定接口类型避免了错误发生。
javax.ejb.EJBException: Local and Remote Interfaces cannot have duplicate interface for bean UserManagerBean
at org.jboss.ejb3.SessionContainer.checkForDuplicateLocalAndRemoteInterfaces(SessionContainer.java:134)
at org.jboss.ejb3.SessionContainer.instantiated(SessionContainer.java:119)
at org.jboss.ejb3.Ejb3Deployment.deployElement(Ejb3Deployment.java:492)
at org.jboss.ejb3.Ejb3Deployment.deployElement(Ejb3Deployment.java:442)

UserManagerBean中的@Local,@Remote必须明确写上接口的类型,才可以。修改代码如下:

package cn.study.ejb;

import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;

@Stateless
@Remote(UserManager.class)
@Local(UserManager.class)
public class UserManagerBean implements UserManager{

public void addUser(User user){
System.out.println(user.getUsername() + "已经被成功保存!");
user.setId(13);


Files contained in javax.ejb.jar: META-INF/MANIFEST.MF javax.ejb.AccessLocalException.class javax.ejb.AccessTimeout.class javax.ejb.ActivationConfigProperty.class javax.ejb.AfterBegin.class javax.ejb.AfterCompletion.class javax.ejb.ApplicationException.class javax.ejb.Asynchronous.class javax.ejb.AsyncResult.class javax.ejb.BeforeCompletion.class javax.ejb.ConcurrencyManagement.class javax.ejb.ConcurrencyManagementType.class javax.ejb.ConcurrentAccessException.class javax.ejb.ConcurrentAccessTimeoutException.class javax.ejb.CreateException.class javax.ejb.DependsOn.class javax.ejb.DuplicateKeyException.class javax.ejb.EJB.class javax.ejb.EJBAccessException.class javax.ejb.EJBContext.class javax.ejb.EJBException.class javax.ejb.EJBHome.class javax.ejb.EJBLocalHome.class javax.ejb.EJBLocalObject.class javax.ejb.EJBMetaData.class javax.ejb.EJBObject.class javax.ejb.EJBs.class javax.ejb.EJBTransactionRequiredException.class javax.ejb.EJBTransactionRolledbackException.class javax.ejb.embeddable.EJBContainer.class javax.ejb.EnterpriseBean.class javax.ejb.EntityBean.class javax.ejb.EntityContext.class javax.ejb.FinderException.class javax.ejb.Handle.class javax.ejb.HomeHandle.class javax.ejb.IllegalLoopbackException.class javax.ejb.Init.class javax.ejb.Local.class javax.ejb.LocalBean.class javax.ejb.LocalHome.class javax.ejb.Lock.class javax.ejb.LockType.class javax.ejb.MessageDriven.class javax.ejb.MessageDrivenBean.class javax.ejb.MessageDrivenContext.class javax.ejb.NoMoreTimeoutsException.class javax.ejb.NoSuchEJBException.class javax.ejb.NoSuchEntityException.class javax.ejb.NoSuchObjectLocalException.class javax.ejb.ObjectNotFoundException.class javax.ejb.PostActivate.class javax.ejb.PrePassivate.class javax.ejb.Remote.class javax.ejb.RemoteHome.class javax.ejb.Remove.class javax.ejb.RemoveException.class javax.ejb.Schedule.class javax.ejb.ScheduleExpression.class javax.ejb.Schedules.class javax.ejb.SessionBean.class javax.ejb.SessionContext.class javax.ejb.Session
这个错误是一个典型的 **EJB 远程调用异常**,核心问题是 **`cn为空白`**(即 `cn` 参数为空)。以下是详细分析和解决方案: --- ### **错误分析** 1. **异常链**: - 最外层:`javax.ejb.EJBException`(WebLogic EJB容器抛出的通用异常- 中间层:`java.rmi.RemoteException`(远程方法调用异常- 根本原因:`javax.ejb.EJBException: cn为空白`(业务逻辑校验失败) 2. **触发位置**: ```java at com.sun.proxy.$Proxy3.getKuangNcV3ByPlate(Unknown Source) // 远程EJB方法调用 at lkm.order.OrderEjb.getNC(OrderEjb.java:72) // 你的代码调用位置 at lkm.order.OrderEjb.main(OrderEjb.java:51) // 程序入口 ``` --- ### **解决方案** #### 1. **检查输入参数** - **问题**:调用 `getKuangNcV3ByPlate()` 方法时,`cn` 参数为空。 - **修复**: ```java // 调用前确保cn参数非空 if (StringUtils.isBlank(cn)) { throw new IllegalArgumentException("参数'cn'不能为空"); } Object result = ejbProxy.getKuangNcV3ByPlate(cn); // 确保cn有效 ``` #### 2. **验证EJB远程接口** - 检查目标EJB的远程接口定义,确认 `cn` 参数的合法性: ```java @Remote public interface YourEjbRemote { SomeResult getKuangNcV3ByPlate(@NotNull String cn) throws RemoteException; // 使用@NotNull注解 } ``` #### 3. **服务器端日志** - 查看 **WebLogic Server日志**(`DOMAIN_HOME/servers/AdminServer/logs/AdminServer.log`),定位服务端具体报错位置。 #### 4. **调试建议** - **客户端**:在 `OrderEjb.java:72` 处打印 `cn` 的值: ```java System.out.println("DEBUG - cn value: " + cn); // 或使用日志框架 ``` - **服务端**:在EJB实现类中添加参数校验: ```java @Override public SomeResult getKuangNcV3ByPlate(String cn) { if (cn == null || cn.trim().isEmpty()) { throw new EJBException("cn为空白"); // 明确抛出业务异常 } // ...业务逻辑 } ``` --- ### **预防措施** 1. **参数校验**: - 使用 Bean Validation(如 `@NotNull`、`@NotEmpty`): ```java public SomeResult getKuangNcV3ByPlate(@NotNull String cn) { ... } ``` 2. **异常处理**: ```java try { ejbProxy.getKuangNcV3ByPlate(cn); } catch (EJBException e) { if (e.getMessage().contains("cn为空白")) { // 处理空参数场景 } } ``` --- ### **常见问题** - **Q:为什么异常显示 `Unknown Source`?** A:因为远程EJB接口是通过动态代理生成的,调试时需要确保客户端有接口的源码或调试符号。 - **Q:如何避免RMI序列化问题?** A:确保所有通过EJB传递的参数实现 `Serializable` 接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值