Glassfish 4扫描@PostConstruct并禁用CDI

我正在做一些Spring应用程序,从Glassfish 3.1.2.2升级到Glassfish 4.1 。 由于我使用Spring来处理@Inject注释,因此我使用以下命令禁用了Glassfish的CDI:

 asadmin set configs.config.server-config.cdi-service.enable-implicit-cdi=false 

但是,当我部署我的一个应用程序时,我收到以下错误消息:

 The lifecycle method [something] must not throw a checked exception. Related annotation information: annotation [@javax.annotation.PostConstruct()] on annotated element [public void com.something.MyClass.something() throws java.io.IOException] of type [METHOD]. Please see server.log for more details. 

有问题的类是一个抽象类,在我试图部署的应用程序中没有实现,它只是我的类路径上的东西。

为什么Glassfish在禁用CDI时validation我的@PostConstruct ? 为什么Glassfish在不能成为bean的东西上validation@PostConstruct ? 如何防止Glassfish干扰我使用Spring 任何东西

注释@PostConstruct是在任何dependency injection机制中使用的通用注释。 Javadoc明确指出,除非在拦截器中使用,否则必须将它放在一个方法上,该方法具有void返回类型并且不会抛出任何已检查的exception。

Spring允许在post-construct方法上检查exception是很奇怪的,因为没有办法处理它们。 但由于此要求仅是validation并且可以忽略,因此Spring可能会忽略已检查的exception,而Glassfish则不会。 可能有一个不必要的Glassfishfunction,它会扫描并validation所有类,即使没有在CDI或任何其他机制中使用(EJB,…)

最好的方法是删除已检查的exception,以使代码与文档保持一致并使其可移植。

您可以首先通过添加带有metadata-complete =“true”的web.xml来解决此问题。 接下来,您需要确保您的上下文位于Web根目录/ WEB-INF /中。

使用此glassfish可以加载所有@PostConstructSpring依赖项。

在我看来,更多的工作。