在Java8我不能继承一个被覆盖的继承注释
我有一个注释在Java8我不能继承一个被覆盖的继承注释
@Qualifier
@Inherited
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface InheritedQualifier {
public String value();
}
和我有四个类,利用它。
- 母公司拥有
@InheritedQualifier("original")
- 儿童延伸父,但不做任何修改
- 如GrandChild延伸家长和具有
@InheritedQualifier("override")
- GreatGrandChild延伸,如GrandChild但不做任何修改
全部四类还使用唯一的名称实现@Named。最后,我有第五类与以下注射:
@Inject @InheritedQualifier("original") @Named("parent") Parent parent;
@Inject @InheritedQualifier("original") @Named("child") Child child;
@Inject @InheritedQualifier("override") @Named("grandChild") GrandChild grandChild;
@Inject @InheritedQualifier("override") @Named("greatGrandChild") GreatGrandChild greatGrandChild;
现在这是奇怪的事情。当我在Oracle的Java7上运行它时,它工作正常。当我在Java8上运行它时,它无法注入GreatGrandChild。这里的错误信息:
javax.enterprise.inject.UnsatisfiedResolutionException: Api type [com.ibm.ws.fat.jcdi.inheritance.GreatGrandChild] is not found with the qualifiers
Qualifiers:[@javax.inject.Named(value=greatGrandChild),@com.ibm.ws.fat.jcdi.inheritance.InheritedQualifier(value=override)]
for injection into Field Injection Point, field name : greatGrandChild, Bean Owner : [MyBean, Name:myBean, WebBeans Type:MANAGED, API Types:[com.ibm.ws.fat.jcdi.inheritance.MyBean,java.lang.Object], Qualifiers:[javax.enterprise.inject.Default,javax.enterprise.inject.Any,javax.inject.Named]]
at org.apache.webbeans.util.InjectionExceptionUtils.throwUnsatisfiedResolutionException(InjectionExceptionUtils.java:77)
at org.apache.webbeans.container.InjectionResolver.checkInjectionPoints(InjectionResolver.java:193)
at org.apache.webbeans.container.BeanManagerImpl.validate(BeanManagerImpl.java:1031)
at org.apache.webbeans.config.BeansDeployer.validate(BeansDeployer.java:444)
at org.apache.webbeans.config.BeansDeployer.validateInjectionPoints(BeansDeployer.java:383)
at org.apache.webbeans.config.BeansDeployer.deploy(BeansDeployer.java:184)
at org.apache.webbeans.lifecycle.AbstractLifeCycle.startApplication(AbstractLifeCycle.java:155)
at org.apache.webbeans.web.lifecycle.WebContainerLifecycle.startApplication(WebContainerLifecycle.java:97)
at com.ibm.ws.webbeans.WebBeansInitializer.onStartup(WebBeansInitializer.java:70)
at com.ibm.ws.webcontainer.webapp.WebApp.initializeServletContainerInitializers(WebApp.java:2485)
at com.ibm.ws.webcontainer.webapp.WebApp.initialize(WebApp.java:1038)
at com.ibm.ws.webcontainer.webapp.WebApp.initialize(WebApp.java:6404)
at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost.startWebApp(DynamicVirtualHost.java:446)
at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost.createRunnableHandler(DynamicVirtualHost.java:248)
at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost.createRunnableHandler(DynamicVirtualHost.java:313)
at com.ibm.ws.http.internal.VirtualHostImpl.discriminate(VirtualHostImpl.java:251)
at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink.ready(HttpDispatcherLink.java:306)
at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:449)
at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.handleNewRequest(HttpInboundLink.java:383)
at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.processRequest(HttpInboundLink.java:283)
at com.ibm.ws.http.channel.internal.inbound.HttpInboundLink.ready(HttpInboundLink.java:254)
at com.ibm.ws.tcpchannel.internal.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:174)
at com.ibm.ws.tcpchannel.internal.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:83)
at com.ibm.ws.tcpchannel.internal.WorkQueueManager.requestComplete(WorkQueueManager.java:504)
at com.ibm.ws.tcpchannel.internal.WorkQueueManager.attemptIO(WorkQueueManager.java:574)
at com.ibm.ws.tcpchannel.internal.WorkQueueManager.workerRun(WorkQueueManager.java:929)
at com.ibm.ws.tcpchannel.internal.WorkQueueManager$Worker.run(WorkQueueManager.java:1018)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:744)
其他三个注射的工作很好。
我在IBM Websphere Liberty Profile上运行此应用程序。
有没有人有任何想法为什么这段代码不能从Java7移植到Java8?
事实证明,这是一个应用程序服务器中的错误;它现在已经被修补了。
此链接Troubleshooting contexts and dependency injection
意味着你有某种类路径的问题。你曾经说过,当你在java 7中运行时,应用程序可以正常工作,但是用java 8则不行。执行环境差异只有 JVM使用?例如,用java 8运行程序所做的唯一更改是将相同的Liberty概要文件指向不同的JVM?
如果不是这种情况,两个执行环境之间的差别很大,而不是两个不同的JVM。
但是,您在注释中提到唯一的变化是JAVA_HOME环境变量。所以,你可能会碰到一个可能的应用程序框架错误,或者java本身内部的一个错误。
我的建议是现在:
如果不使用Java 8工作,避免使用它。 Java 8是一种新的,它不到一岁。对于服务器使用,它是一个婴儿...顺便说一下,最新的Websphere规范只支持Java 6或7 ...检查出来:Websphere 8.5.5 requirements - java
java 7和java 8之间已知的不兼容,也许可能你刚刚击中他们其中之一,间接: incompatibilities between java 7 and 8- oracle doc
唯一的区别是使用的JVM。我运行服务器它工作正常,然后我关闭服务器,更改JAVA_HOME,再次启动,并出现问题。 – 2015-03-03 12:35:39
不同的java版本之间有细微的差异,也许你只是构建其中一个... – 2015-03-09 11:10:23