簡體   English   中英

如何在新的grails 3應用程序中使用現有的web.xml?

[英]How to use an existing web.xml in my new grails 3 app?

根據此處的文檔說:

如果您有一個經過修改的web.xml模板,那么您將需要將其遷移到Spring,因為Grails 3.x不使用web.xml(盡管仍然可以在src / main / webapp / WEB-INF / web.xml)。

我的意思是,如果我合並了一個具有web.xml第三方專有庫,那么我可以將其原封不動地放在src/main/webapp/WEB-INF (連同他們放置在tomcat中的所有其他內容) webapp目錄)和grails將其加載。 這種解釋正確嗎? 這似乎暗示了這個答案。

我用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中的定義。 希望有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM