gpt4 book ai didi

spring-boot - 如何在新的grails 3应用程序中使用现有的web.xml?

转载 作者:行者123 更新时间:2023-12-02 15:44:26 25 4
gpt4 key购买 nike

根据here文档,它说:

If you have a modified web.xml template then you will need to migrate this to Spring as Grails 3.x does not use a web.xml (although it is still possible to have on in src/main/webapp/WEB-INF/web.xml).



我的意思是,如果我要合并一个具有 web.xml的第三方专有库,那么我可以将其原封不动地放入 src/main/webapp/WEB-INF中(连同他们放置在tomcat webapp目录中的所有其他内容)并将grails加载进去。这种解释正确吗? this答案似乎暗示了这一点。

我使用 react配置文件(我也尝试了 web配置文件)和一个调用其servlet的网页启动了grails 3应用程序。但是,虽然可以找到 webapp中的html文件,但是servlet调用本身正在返回 404,我不知道为什么。如果我构建一个war文件并部署在一个独立的tomcat上,则servlet调用可以工作,但是当我这样运行时:
./gradlew server:bootRun --debug

然后没有,而且我看不到控制台上印有任何有趣的内容。

是否需要我处理一些URL映射或 application.yml中的某些内容?

在web.xml中,被调用的servlet看起来像这样(这只是其中的一小部分):
<servlet>
<servlet-name>DataSourceLoader</servlet-name>
<servlet-class>com.isomorphic.servlet.DataSourceLoader</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DataSourceLoader</servlet-name>
<url-pattern>/isomorphic/DataSourceLoader</url-pattern>
</servlet-mapping>

我意识到替代方法是使用 Beans重写 web.xml并将内容放入 resources.groovy中,但是我更喜欢一种方法,它需要尽可能少的代码。

[更新]

我已经可以使用以下命令更新 grails-app/conf/spring/resources.groovy:
import org.springframework.boot.web.servlet.ServletRegistrationBean
// Place your Spring DSL code here
beans = {
DataSourceLoader(ServletRegistrationBean) { bean ->
servlet = new com.isomorphic.servlet.DataSourceLoader()
urlMappings = ['/isomorphic/DataSourceLoader']
}
}

它似乎正在工作...不过,我仍然对仅使用 web.xml的方法感兴趣,这是我的原始问题。

最佳答案

从Grails 2.x升级到Grails 3.3的过程中,我以前使用过web.xml来定义第三方servlet。

为了使这些servlet可用(并在启动时加载),我采取的方法是通过一个自定义类。因此,您可以这样在src / java中定义一个自定义类:

import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ServletRegistrations {

@Bean
public ServletRegistrationBean fileServlet(){
ServletRegistrationBean registration = new ServletRegistrationBean(new FileServlet(), "/files/*");

// to load add startup uncomment the line below
//registration.setLoadOnStartup(1);

// define init param
registration.addInitParameter("basePath","/WEB-INF/resources");
return registration;
}
}

因此,尽管您没有在一个XML文件中定义所有内容,但仍然可以在一个类中定义所有servlet,所以这并不是什么大的改变,我现在已经经历了一次,我希望能够代码而不是xml中的定义。希望有帮助!

关于spring-boot - 如何在新的grails 3应用程序中使用现有的web.xml?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51108930/

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