Как использовать существующий файл 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. Надеюсь, это поможет!