首页 > 解决方案 > gwt应用程序和spring MVC返回错误404

问题描述

我有一个带有 spring core 4 框架的 gwt 应用程序。在服务器部分,我添加了一个 RestController 来为其他应用程序生成 Web 服务。我为此使用了 Java 配置,但是现在当我在嵌入式服务器 Jetty 中运行应用程序时,gwt 应用程序运行完美,但 web 服务(错误 404)运行良好,当我在 jboss 7.1.1 中运行战争时,Rest WebService 运行良好但不是gwt 应用程序(错误 404)。

这是我的新配置:

    @RestController
    @RequestMapping(value = "/historiquedlo", produces = "application/hal+json", consumes = { "text/plain","text/html","application/*" })
    @Transactional
    public class WsHistoriqueDlo {

        /**
         * En dur dans PCD
         */
        private static final String DEFAULT_CODE_PRODUIT_DL = "L20";

        @Autowired
        private EntityManager entityManager;

        /**
         * Méthode avec 4 paramètres : Code produit par défaut L20
         * 
         * @param siren
         * @param debut
         *            : ISO Date Format yyyy-MM-dd, e.g. "2000-10-31".
         * @param sirenGroupe
         * @param sirenTeteGroupe
         * @return ResponseEntity<Resources<HistoriqueDlo>>
         */
        @RequestMapping(value = "/{siren}/{debut}", method = RequestMethod.GET)
        public ResponseEntity<Resource<InfoHistoriqueDlo>> findHistoriqueDlo(@PathVariable("siren") final String siren,
                @PathVariable("debut") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) final String debut,
                @RequestParam(name="sirenGroupe", required=false) final String sirenGroupe,
                @RequestParam(name="sirenTeteGroupe", required=false) final String sirenTeteGroupe) { 
.
.
.}  
public class SoftWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
 @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { SoftWebConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }

    @Override
    protected String[] getServletMappings() {
         return new String[]{"/*","/ws/*"};     }

}

对于 SoftWebConfig,我使用了这个配置:

@Configuration
@Import(SoftDBConfig.class)
@EnableScheduling
@EnableWebMvc
@EnableHypermediaSupport(type = { HypermediaType.HAL })
@ComponentScan(basePackages = { "com.rcibanque.socle.server.*", "com.rcibanque.sof.server.*",
        "com.rcibanque.socle.server.ws.*" })
public class SoftWebConfig implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
    }

    @Bean(name = "TOPCAR-EXECUTOR", destroyMethod = "shutdown")
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(1);
    }

}

我的 web.xml 是这样的:

> <?xml version="1.0" encoding="UTF-8"?> <web-app
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
>               http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
> 
>   <display-name>rci_sof</display-name>
>   
> 
>   <!-- Servlet de démarrage de l'application -->  <servlet>
>       <servlet-name>AppContextInitializerServlet</servlet-name>
>       <servlet-class>com.rcibanque.sof.server.servlet.SofContextInitializerServlet</servlet-class>
>       <load-on-startup>1</load-on-startup>    </servlet>
> 
>   <!-- Services RPC -->   <servlet>
>       <servlet-name>dataServiceRPC</servlet-name>
>       <servlet-class>com.rcibanque.sof.server.service.data.SofDataServiceImpl</servlet-class>
>   </servlet>  <servlet-mapping>
>       <servlet-name>dataServiceRPC</servlet-name>
>       <url-pattern>/rci_sof/dataService.rpc</url-pattern>
>   </servlet-mapping>  <servlet-mapping>
>       <servlet-name>dataServiceRPC</servlet-name>
>       <url-pattern>/rci_admin/dataService.rpc</url-pattern>
>   </servlet-mapping>
> 
>   <servlet>       <servlet-name>dataModuleServiceRPC</servlet-name>
>       <servlet-class>com.rcibanque.sof.server.service.data.SofDataModuleServiceImpl</servlet-class>
>   </servlet>  <servlet-mapping>
>       <servlet-name>dataModuleServiceRPC</servlet-name>
>       <url-pattern>/rci_sof/dataModuleService.rpc</url-pattern>
>   </servlet-mapping>  <servlet-mapping>
>       <servlet-name>dataModuleServiceRPC</servlet-name>
>       <url-pattern>/rci_admin/dataModuleService.rpc</url-pattern>
>   </servlet-mapping>
> 
>   <servlet>       <servlet-name>tariffingServiceRPC</servlet-name>
>       <servlet-class>com.rcibanque.sof.server.service.tariffing.TariffingServiceImpl</servlet-class>
>   </servlet>  <servlet-mapping>
>       <servlet-name>tariffingServiceRPC</servlet-name>
>       <url-pattern>/rci_sof/tariffingService.rpc</url-pattern>
>   </servlet-mapping>  <servlet-mapping>
>       <servlet-name>tariffingServiceRPC</servlet-name>
>       <url-pattern>/rci_admin/tariffingService.rpc</url-pattern>
>   </servlet-mapping>
> 
>   <!-- RPC Chart -->  <servlet>       <servlet-name>chartRPC</servlet-name>
>       <servlet-class>com.rcibanque.sof.server.chart.ChartGeneratorImpl</servlet-class>
>   </servlet>  <servlet-mapping>       <servlet-name>chartRPC</servlet-name>
>       <url-pattern>/rci_sof/chart.rpc</url-pattern>   </servlet-mapping>
> 
>   <!-- RPC Print Report -->   <servlet>
>       <servlet-name>printReportRPC</servlet-name>
>       <servlet-class>com.rcibanque.sof.server.print.report.SofPrintReportImpl</servlet-class>
>   </servlet>  <servlet-mapping>
>       <servlet-name>printReportRPC</servlet-name>
>       <url-pattern>/rci_sof/printReport.rpc</url-pattern>
>   </servlet-mapping>
> 
>   <!-- RPC Mail -->   <servlet>
>       <servlet-name>messagingServiceRPC</servlet-name>
>       <servlet-class>com.rcibanque.sof.server.print.messaging.SofMessagingServiceImpl</servlet-class>
>   </servlet>  <servlet-mapping>
>       <servlet-name>messagingServiceRPC</servlet-name>
>       <url-pattern>/rci_sof/messagingService.rpc</url-pattern>
>   </servlet-mapping>
> 
>   <!-- RPC TOPCAR -->     <servlet>
>       <servlet-name>topCarServiceRPC</servlet-name>
>       <servlet-class>com.rcibanque.sof.server.service.topcar.TopCarService</servlet-class>    </servlet>  <servlet-mapping>
>       <servlet-name>topCarServiceRPC</servlet-name>
>       <url-pattern>/rci_sof/topCarService.rpc</url-pattern>
>   </servlet-mapping>  <servlet-mapping>
>       <servlet-name>topCarServiceRPC</servlet-name>
>       <url-pattern>/rci_admin/topCarService.rpc</url-pattern>
>   </servlet-mapping>
> 
>   <!-- RPC Fiscalité CO2 -->  <servlet>
>       <servlet-name>fiscaliteCO2</servlet-name>
>       <servlet-class>com.rcibanque.socle.server.service.data.FiscaliteCO2Service</servlet-class>
>   </servlet>  <servlet-mapping>
>       <servlet-name>fiscaliteCO2</servlet-name>
>       <url-pattern>/rci_sof/fiscaliteCO2Service.rpc</url-pattern>
>   </servlet-mapping>  <servlet-mapping>
>       <servlet-name>fiscaliteCO2</servlet-name>
>       <url-pattern>/rci_admin/fiscaliteCO2Service.rpc</url-pattern>
>   </servlet-mapping>
> 
>   <!-- RPC Offre -->  <servlet>
>       <servlet-name>offreServiceRPC</servlet-name>
>       <servlet-class>com.rcibanque.sof.server.service.offre.OffreServiceRPCImpl</servlet-class>
>   </servlet>  <servlet-mapping>
>       <servlet-name>offreServiceRPC</servlet-name>
>       <url-pattern>/rci_sof/offreService.rpc</url-pattern>
>   </servlet-mapping>
> 
>   <!-- Servlets -->   <servlet>
>       <servlet-name>displayChartServlet</servlet-name>
>       <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
>   </servlet>  <servlet-mapping>
>       <servlet-name>displayChartServlet</servlet-name>
>       <url-pattern>/rci_sof/displayChart</url-pattern>    </servlet-mapping>
> 
>   <servlet>       <servlet-name>downloadServlet</servlet-name>
>       <servlet-class>com.rcibanque.socle.server.servlet.DownloadServlet</servlet-class>
>   </servlet>  <servlet-mapping>
>       <servlet-name>downloadServlet</servlet-name>
>       <url-pattern>*.pdf</url-pattern>    </servlet-mapping>
>   <servlet-mapping>       <servlet-name>downloadServlet</servlet-name>
>       <url-pattern>*.xls</url-pattern>    </servlet-mapping>
>   <servlet-mapping>       <servlet-name>downloadServlet</servlet-name>
>       <url-pattern>*.txt</url-pattern>    </servlet-mapping>
>   <servlet-mapping>       <servlet-name>downloadServlet</servlet-name>
>       <url-pattern>*.csv</url-pattern>    </servlet-mapping>
> 
>   <servlet>       <servlet-name>topcarDownloadServlet</servlet-name>
>       <servlet-class>com.rcibanque.socle.server.servlet.TopcarDownloadServlet</servlet-class>
>   </servlet>  <servlet-mapping>
>       <servlet-name>topcarDownloadServlet</servlet-name>
>       <url-pattern>/rci_sof/download</url-pattern>    </servlet-mapping>
>   <servlet>       <servlet-name>uploadServlet</servlet-name>
>       <servlet-class>com.rcibanque.socle.server.servlet.UploadServlet</servlet-class>
>   </servlet>  <servlet-mapping>
>       <servlet-name>uploadServlet</servlet-name>
>       <url-pattern>/rci_sof/upload</url-pattern>  </servlet-mapping>
>   <servlet-mapping>       <servlet-name>uploadServlet</servlet-name>
>       <url-pattern>/rci_admin/upload</url-pattern>    </servlet-mapping>
>   <servlet>       <servlet-name>uploadTopcarServlet</servlet-name>
>       <servlet-class>com.rcibanque.socle.server.servlet.UploadTopcarServlet</servlet-class>
>   </servlet>  <servlet-mapping>
>       <servlet-name>uploadTopcarServlet</servlet-name>
>       <url-pattern>/rci_sof/uploadTopcar</url-pattern>    </servlet-mapping>
> 
> 
>   <!-- Filtre de gestion des caches -->   <filter>
>       <filter-name>gwtCacheControlFilter</filter-name>
>       <filter-class>com.rcibanque.socle.server.filter.GWTCacheControlFilter</filter-class>
>   </filter>   <filter-mapping>
>       <filter-name>gwtCacheControlFilter</filter-name>
>       <url-pattern>/*</url-pattern>   </filter-mapping>
> 
>   <!-- Default page to serve -->  <welcome-file-list>
>       <welcome-file>Index.html</welcome-file>     </welcome-file-list>
> 
>   <!-- Timeout QC32499 session connexion timeout <session-config>
> <session-timeout>300</session-timeout>        </session-config> -->
> 
> </web-app>

我将http://localhost:8080/rci_sof/Index.html用于 gwt 应用程序,对于 Web 服务,我使用此 Url:http://localhost:8080/rci_sof/ws/historiquedlo/30365637500209/L20/2​​018-06 -20?sirenGroupe=950425694&sirenTeteGroupe=447938036

谢谢你 。

标签: javaspring-mvcgwtjbossjetty

解决方案


您可以使用web.xml文件

使用AbstractAnnotationConfigDispatcherServletInitializer.class(来自 servlet 版本 3.0+)初始化您的应用程序。
目前,您同时提供两者,并且只有一个可以工作。

最简单的方法可能是初始化您的调度程序 servletweb.xml并删除SoftWebInitializer.class.

将此添加到您的 web.xml(为您的 SoftWebConfig 使用正确的路径):所有 spring 控制器现在都将具有基本 urllocalhost:8080/ws

  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    <init-param>
      <param-name>contextClass</param-name>
      <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
    </init-param>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>XXXXX.XXXXX.SoftWebConfig</param-value>
    </init-param>
  </servlet>

<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/ws/*</url-pattern>
</servlet-mapping>

使用 spring WebApplicationInitializer而不是web.xml文件仅适用于 servlet 版本 3.0+,但您的 web.xml 当前指定版本 2.5。
因此,要实际使用,AbstractAnnotationConfigDispatcherServletInitializer您必须删除web.xml文件并将所有内容迁移到新的 Initializer 文件。
还需要支持 servlet 3.0 及更高版本的网络服务器。Jetty 至少需要版本 8


推荐阅读