gpt4 book ai didi

java - WildFly - 从 WAR 获取资源

转载 作者:搜寻专家 更新时间:2023-11-01 01:43:02 25 4
gpt4 key购买 nike

我正在使用以下方法从 WildFly 中的 WAR 文件获取资源:

this.getClass().getResource(relativePath)

当应用程序部署为展开的 WAR 时,它会起作用。 它过去也适用于压缩的 WAR。昨天,我在 Eclipse 中对项目进行了清理和重建,它就停止工作了。

当我检查资源根时:

logger.info(this.getClass().getResource("/").toExternalForm());

我明白了:

file:/C:/JBoss/wildfly8.1.0.CR1/modules/system/layers/base/org/jboss/as/ejb3/main/timers/

所以,难怪它不起作用。它可能与 JBoss 模块加载有关,但我不知道这是错误还是正常行为。

我在 StackOverflow 上发现了各种类似的问题,但没有适用的解决方案。其中一个建议是像这样使用 ServletContext:

@Resource
private WebServiceContext wsContext;
...
ServletContext servletContext = (ServletContext)this.wsContext.getMessageContext()
.get(MessageContext.SERVLET_CONTEXT);
servletContext.getResource(resourcePath);

但是,当我尝试以这种方式获取 MessageContext 时,我得到了一个 IllegalStateException。所以我基本上被卡住了。有什么想法吗?

最佳答案

我遇到了同样的问题,我没有将资源定义为共享模块,而是通过在我的 WAR 中使用 ServletContextListener 解决了这个问题。

在 contextInitialized 方法中,我从 ServletContextEvent 获取了 ServletContext 并使用它的 getResource("/WEB-INF/myResource") 获取我的 WAR 文件中资源的 URL。似乎在 ServletContextListener 中,.getResource() 方法按预期解析,而不是“/modules/system/layers/base/org/jboss/as/ejb3/main/timers/”url。然后可以将该 URL 存储在 ServletContext 中供您的 servlet 或注入(inject)的 ApplicationScoped CDI bean 中使用。

@WebListener
public class ServletInitializer implements ServletContextListener {

@Override
public void contextInitialized(ServletContextEvent sce) {
try {
final ServletContext context = sce.getServletContext();
final URL resourceUrl = context.getResource("/WEB-INF/myResource");
context.setAttribute("myResourceURL", resourceUrl);
} catch (final MalformedURLException e) {
throw new AssertionError("Resource not available in WAR file", e);
}
}

@Override
public void contextDestroyed(ServletContextEvent sce) {}
}

@WebListener
public class ServletInitializer implements ServletContextListener {

@Inject
private SomeApplicationScopedBean myBean;

@Override
public void contextInitialized(ServletContextEvent sce) {
try {
final ServletContext context = sce.getServletContext();
final URL resourceUrl = context.getResource("/WEB-INF/myResource");
myBean.setResourceUrl(resourceUrl);
} catch (final MalformedURLException e) {
throw new AssertionError("Resource not available in WAR file", e);
}
}

@Override
public void contextDestroyed(ServletContextEvent sce) {}
}

关于java - WildFly - 从 WAR 获取资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23845031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com