Как использовать существующий файл web.xml в моем новом приложении Grails 3? - PullRequest
0 голосов
/ 29 июня 2018

Согласно документации здесь написано:

Если у вас есть измененный шаблон 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 будет загружать его. Правильно ли это толкование? Это то, что подразумевается под этим ответом.

Я запустил приложение Grails 3 с профилем react (я тоже пробовал профиль web) и веб-страницей с вызовами их сервлетов. Однако, хотя HTML-файл в webapp можно найти, сам вызов сервлета возвращает 404, и я не могу понять, почему. Если я создаю файл войны и развертываю на отдельном коте, вызов сервлета работает, но когда я запускаю так:

./gradlew server:bootRun --debug

тогда это не так, и я не вижу ничего интересного, напечатанного на консоли.

Есть ли какое-то сопоставление URL, которым я должен манипулировать или что-то в application.yml?

В файле web.xml вызываемый сервлет выглядит следующим образом (это маленький кусочек, правда?):

<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>

Я понимаю, что альтернатива состоит в том, чтобы переписать web.xml с использованием Beans и поместить вещи в 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 голосов
/ 30 июня 2018

В рамках обновления с Grails 2.x до Grails 3.3 я ранее использовал web.xml для определения сторонних сервлетов.

Подход, который я использовал для того, чтобы сделать эти сервлеты доступными (и загрузить при запуске), был через пользовательский класс. Таким образом, вы можете определить собственный класс в 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-файле, вы все равно можете определить все свои сервлеты в этом единственном классе, так что это не большое изменение, и теперь я прошел через это один раз, но я предпочитаю возможность делать определения в коде, а не в XML. Надеюсь, это поможет!

...