有CDI的麻烦。这是一个场景:一个非常令人印象深刻的SLSB
import javax.ejb.Remote;
import javax.ejb.Stateless;
import edu.xxx.aop.log.utils.AopLog;
@Stateless
@Remote(EjbGatewayRemote.class)
public class EjbGateway implements EjbGatewayRemote {
@AopLog
public String echo(String msg) {
return "echo: "+msg;
}
}
一个令人印象深刻的拦截器:
import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptor;
import javax.interceptor.InvocationContext;
import org.apache.log4j.Logger;
@AopLog
@Interceptor
public class AopLogger {
private static Logger logger = Logger.getLogger(AopLogger.class);
private long time;
private StringBuilder sb;
public AopLogger() {}
@AroundInvoke
public Object log(InvocationContext icx) {
sb = new StringBuilder();
sb.append(icx.getClass().getCanonicalName()+"."+icx.getMethod().toString());
sb.append("(");
for(Object o : icx.getParameters()) {
sb.append(" "+o.getClass()+" "+o.toString());
}
sb.append(" )");
logger.info(sb.toString());
time = System.currentTimeMillis();
try {
return icx.proceed();
} catch (Exception e) {
logger.error(e);
return null;
} finally {
sb = new StringBuilder();
sb.append(icx.getClass().getCanonicalName()+"."+icx.getMethod().toString());
sb.append(" complete in "+(System.currentTimeMillis() - time)+" milliseconds.");
logger.debug(sb.toString());
}
}
}
及其注释:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.interceptor.InterceptorBinding;
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface AopLog {}
SLSB和拦截器位于不同的模块中,两者都部署在%JBossAS7.1.1.Final HOME%/ standalone / deploymentments中,分别部署在AopLogEJB.jar和AopLogUtils.jar中。 AopLogEJB.jar有这个beans.xml:
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<interceptors>
<class>edu.pezzati.aop.log.utils.AopLogger</class>
</interceptors>
</beans>
和这个MANIFEST.MF
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: Francesco
Build-Jdk: 1.6.0_26
Dependencies: deployment.AopLogUtils.jar
AopLogUtils.jar有这个beans.xml:
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>
和这个MANIFEST.MF:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: Francesco
Build-Jdk: 1.6.0_26
当AopLogUtils.jar部署得很好时,我在部署AopLogEJB.jar时遇到错误:
ERROR [org.jboss.msc.service.fail] (MSC service thread 1-4) MSC00001: Failed to start service jboss.deployment.unit."AopLogEJB.jar".WeldService: org.jboss.msc.service.StartException in service jboss.deployment.unit."AopLogEJB.jar".WeldService: org.jboss.weld.exceptions.DeploymentException: WELD-001417 Enabled interceptor class <class>edu.xxx.aop.log.utils.AopLogger</class> in vfs:/C:/Users/Francesco/jboss-as-7.1.1.Final/bin/content/AopLogEJB.jar/META-INF/beans.xml@4 is neither annotated @Interceptor nor registered through a portable extension
at org.jboss.as.weld.services.WeldService.start(WeldService.java:83)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [rt.jar:1.6.0_26]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [rt.jar:1.6.0_26]
at java.lang.Thread.run(Thread.java:662) [rt.jar:1.6.0_26]
Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001417 Enabled interceptor class <class>edu.xxx.aop.log.utils.AopLogger</class> in vfs:/C:/Users/Francesco/jboss-as-7.1.1.Final/bin/content/AopLogEJB.jar/META-INF/beans.xml@4 is neither annotated @Interceptor nor registered through a portable extension
at org.jboss.weld.bootstrap.Validator.validateEnabledInterceptorClasses(Validator.java:491)
at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:369)
at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:379)
at org.jboss.as.weld.WeldContainer.start(WeldContainer.java:83)
at org.jboss.as.weld.services.WeldService.start(WeldService.java:76)
... 5 more
整个东西在Wildfly上运行良好。这是关于JBoss7焊接模块的问题吗?我已经将模块从1.1.5更新到1.1.10但没有任何改变。