Как использовать существующий файл web.xml в моем новом приложении Grails 3?

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

Если у вас есть измененный шаблон 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 используя бобы и положить вещи в 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 ответ

Как часть обновления с 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. Надеюсь, это поможет!

Другие вопросы по тегам