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

时间:2018-06-29 20:24:09

标签: spring-boot grails grails3

根据文档here,它说:

  

如果您有一个经过修改的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将加载它。这种解释正确吗? 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的方式感兴趣,这是我的原始问题。

1 个答案:

答案 0 :(得分:0)

作为从Grails 2.x升级到Grails 3.3的一部分,我以前使用过web.xml来定义第三方servlet。

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

Private Sub Rcagayan_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cagayan.CheckedChanged
    If Duration.Text = "" Then
        MessageBox.Show("Please Select Duration", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    End if

    If Cagayan.Checked = False Then
        Abulug.Checked = False
        Allacapan.Checked = False
        Alcala.Checked = False
        Amulung.Checked = False
        Aparri.Checked = False
        Baggao.Checked = False
        Ballesteros.Checked = False
        Buguey.Checked = False
        Camal.Checked = False
        Claveria.Checked = False
        Enrile.Checked = False
        Gattaran.Checked = False
        Gonzaga.Checked = False
        Iguig.Checked = False
        Lasam.Checked = False
        Lallo.Checked = False
        Pamplona.Checked = False
        Penablanca.Checked = False
        Piat.Checked = False
        Rizal.Checked = False
        SantaAna.Checked = False
        StaTere.Checked = False
        Santonino.Checked = False
        Praxedes.Checked = False
        Sanchez.Checked = False
        Solana.Checked = False
        Tuao.Checked = False
        Tugue.Checked = False

        btnUncheckedckbExpectedFalse.PerformClick()
        btnAdvicedUnchecked.PerformClick()
        Me.btncagayan.PerformClick()
        Me.btnTstmFormat.PerformClick()
    End If

End Sub

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