2015-03-03 67 views
1

我有一個註釋在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?

回答

0

事實證明,這是一個應用程序服務器中的錯誤;它現在已經被修補了。

0

此鏈接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

+0

唯一的區別是使用的JVM。我運行服務器它工作正常,然後我關閉服務器,更改JAVA_HOME,再次啓動,並出現問題。 – 2015-03-03 12:35:39

+0

不同的java版本之間有細微的差異,也許你只是構建其中一個... – 2015-03-09 11:10:23