ejbsessionbean.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 607 行 · 第 1/2 页
JAVA
607 行
else if (interfaceList.size() != 1) throw new ConfigException(L.l("'{0}' has multiple interfaces, but none are marked as @Local or @Remote.\n{1}", type.getName(), interfaceList.toString())); else { setLocalWrapper(interfaceList.get(0)); } // XXX: Check ejb30/bb/session/stateless/migration/twothree/annotated // There is a conflict between 2.1 and 3.0 interfaces. // ejb/0f6f // The session bean might have @RemoteHome for EJB 2.1 and // the @Remote interface for EJB 3.0 (same with @LocalHome and @Local). // TCK: ejb30/bb/session/stateful/sessioncontext/annotated ApiClass ejbClass = getEJBClassWrapper(); LocalHome localHomeAnn = ejbClass.getAnnotation(LocalHome.class); // ejb/0f6f if (localHomeAnn != null) { Class localHome = localHomeAnn.value(); setLocalHome(localHome); } RemoteHome remoteHomeAnn = ejbClass.getAnnotation(RemoteHome.class); // ejb/0f6f if (remoteHomeAnn != null) { Class home = remoteHomeAnn.value(); setHome(home); } } /** * Deploys the bean. */ @Override public AbstractServer deployServer(EjbContainer ejbContainer, JavaClassGenerator javaGen) throws ClassNotFoundException, ConfigException { AbstractServer server; if (isStateless()) server = new StatelessServer(ejbContainer); else server = new StatefulServer(ejbContainer); server.setModuleName(getEJBModuleName()); server.setEJBName(getEJBName()); server.setMappedName(getMappedName()); server.setId(getEJBModuleName() + "#" + getEJBName()); server.setContainerTransaction(_isContainerTransaction); server.setEjbClass(loadClass(getEJBClass().getName())); ApiClass remoteHome = getRemoteHome(); if (remoteHome != null) server.setRemoteHomeClass(loadClass(remoteHome.getName())); ArrayList<ApiClass> remoteList = _sessionBean.getRemoteApi(); if (remoteList.size() > 0) { ArrayList<Class> classList = new ArrayList<Class>(); for (ApiClass apiClass : remoteList) { classList.add(loadClass(apiClass.getName())); } server.setRemoteApiList(classList); } /* if (getRemote21() != null) server.setRemote21(loadClass(getRemote21().getName())); */ ApiClass localHome = getLocalHome(); if (localHome != null) server.setLocalHomeClass(loadClass(localHome.getName())); ArrayList<ApiClass> localList = _sessionBean.getLocalApi(); if (localList.size() > 0) { ArrayList<Class> classList = new ArrayList<Class>(); for (ApiClass apiClass : localList) { classList.add(loadClass(apiClass.getName())); } server.setLocalApiList(classList); } /* if (getLocal21() != null) server.setLocal21(loadClass(getLocal21().getName())); */ Class contextImplClass = javaGen.loadClass(getSkeletonName()); server.setContextImplClass(contextImplClass); Class beanClass = javaGen.loadClass(getEJBClass().getName()); Thread thread = Thread.currentThread(); ClassLoader oldLoader = thread.getContextClassLoader(); try { thread.setContextClassLoader(server.getClassLoader()); ContainerProgram initContainer = getInitProgram(); server.setInitProgram(initContainer); try { if (getServerProgram() != null) getServerProgram().configure(server); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw ConfigException.create(e); } } finally { thread.setContextClassLoader(oldLoader); } return server; } private void introspectSession() throws ConfigException { ApiClass ejbClass = getEJBClassWrapper(); if (ejbClass.isAnnotationPresent(Stateless.class)) introspectStateless(ejbClass); else if (ejbClass.isAnnotationPresent(Stateful.class)) introspectStateful(ejbClass); } private void introspectStateless(ApiClass type) throws ConfigException { String className = type.getName(); Stateless stateless = type.getAnnotation(Stateless.class); setAllowPOJO(true); setSessionType("Stateless"); setTransactionType(type); String name; if (stateless != null) name = stateless.name(); else name = className; introspectBean(type, name); } private void introspectStateful(ApiClass type) throws ConfigException { String className = type.getName(); Stateful stateful = type.getAnnotation(Stateful.class); setAllowPOJO(true); setSessionType("Stateful"); setTransactionType(type); String name; if (stateful != null) name = stateful.name(); else name = className; introspectBean(type, name); } private void setTransactionType(ApiClass type) { TransactionManagement transaction = type.getAnnotation(TransactionManagement.class); if (transaction == null) setTransactionType("Container"); else if (TransactionManagementType.BEAN.equals(transaction.value())) setTransactionType("Bean"); else setTransactionType("Container"); } private void validateMethods() throws ConfigException { } /** * Validates the home interface. */ private void validateHome(ApiClass homeClass, ApiClass objectClass) throws ConfigException { ApiClass beanClass = getEJBClassWrapper(); String beanName = beanClass.getName(); if (homeClass == null) return; String homeName = homeClass.getName(); String objectName = objectClass.getName(); boolean hasFindByPrimaryKey = false; if (! homeClass.isPublic()) throw error(L.l("'{0}' must be public", homeName)); if (beanClass.isFinal()) throw error(L.l("'{0}' must not be final", beanName)); if (beanClass.isAbstract()) throw error(L.l("'{0}' must not be abstract", beanName)); if (! homeClass.isInterface()) throw error(L.l("'{0}' must be an interface", homeName)); boolean hasCreate = false; for (ApiMethod method : homeClass.getMethods()) { String name = method.getName(); Class []param = method.getParameterTypes(); Class retType = method.getReturnType(); if (method.getDeclaringClass().isAssignableFrom(EJBHome.class) || method.getDeclaringClass().isAssignableFrom(EJBLocalHome.class)) continue; if (EJBHome.class.isAssignableFrom(homeClass.getJavaClass())) validateException(method, java.rmi.RemoteException.class); if (name.startsWith("create")) { hasCreate = true; // TCK: ejb30/bb/session/stateless/migration/twothree/descriptor/callLocalSameTxContextTest // XXX TCK, needs QA: if a stateless session bean has EJB 3.0 and 2.1 interfaces, // it is not required to have a matching ejbCreate(). // It may have a @PostConstruct method, if any. if (isStateless() && name.equals("create")) continue; if (isStateless() && (! name.equals("create") || method.getParameterTypes().length != 0)) { throw error(L.l("{0}: '{1}' forbidden in stateless session home. The create() method for a stateless session bean must have zero arguments.", method.getFullName(), homeName)); } if (! isAllowPOJO()) validateException(method, CreateException.class); /* XXX: ejb/0f6f The session bean might have @RemoteHome for EJB 2.1 and the @Remote interface for EJB 3.0 TCK: ejb30/bb/session/stateful/sessioncontext/annotated if (! retType.equals(objectClass)) throw error(L.l("{0}: '{1}' must return {2}. Create methods must return the local or remote interface.", homeName, method.getFullName(), objectClass.getName())); */ String createName = "ejbC" + name.substring(1); ApiMethod implMethod = validateNonFinalMethod(createName, param, method, homeClass, isAllowPOJO()); if (implMethod != null) { if (! implMethod.getReturnType().getName().equals("void")) throw error(L.l("'{0}' must return {1} in {2}", getFullMethodName(createName, param), "void", beanName)); validateExceptions(method, implMethod.getExceptionTypes()); } } else if (name.startsWith("ejb") || name.startsWith("remove")) { throw error(L.l("'{0}' forbidden in {1}", method.getFullName(), homeClass.getName())); } } if (! hasCreate) throw error(L.l("'{0}' needs at least one create method. Session beans need a create method.", homeClass.getName())); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?