2016-05-26 63 views
0

我有Spring MVC項目來開發示例REST api。當我在tomcat中部署應用時,它正在運行。現在,我想用Spring引導來更新項目。我已經創建主彈簧引導應用類,這是作爲在下面包:com.abc.demo.config使用Spring啓動時請求不是來控制器

@EnableAutoConfiguration // Sprint Boot Auto Configuration 
@ComponentScan(basePackages = "com.abc.demo") 
@EnableWebMvc 
public class Application extends SpringBootServletInitializer { 

    private static final Class<Application> applicationClass = Application.class; 
    private static final Logger log = LoggerFactory.getLogger(applicationClass); 

    public static void main(String[] args) { 
     SpringApplication.run(applicationClass, args); 
    } 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(applicationClass); 
    } 
    @Bean 
    public DispatcherServlet dispatcherServlet() { 
     return new DispatcherServlet(); 
    } 

} 

我的控制器是在com.abc.demo.Controller是象下面這樣:

@RestController 
public class MyController { 

    static final Logger logger = Logger.getLogger(MyController.class); 

    @Inject 
    private MyService myService; 
    @RequestMapping(value = "/mytask/{task}", method = RequestMethod.GET, produces = "application/json") 
    @ResponseBody 
    public int myTask(@PathVariable String task) { 
     return myService.service(task); 
    } 

} 

當我在本地tomcat中部署應用程序而不添加spring引導時,它正在部署,我能夠看到服務的響應。 (我在運行應用程序時也有web.xml和調度程序servlet)。但是,當我添加spring引導並從命令行運行應用程序時,應用程序正在運行(我在運行應用程序時運行了一些線程,當我看到運行時)。但是當我curl時,請求並沒有進入控制器,並且看到URI未找到登錄控制檯,如下所示:沒有找到具有URI的HTTP請求的映射[/ [myservice-name]/myTask 我在這裏錯過了什麼嗎?感謝有人指出我錯過的東西。

回答

0

工作。將Application移至com.abc.demo(或項目的實際根包)。然後刪除大部分。您所有的註釋都可以用一個簡單的@SpringBootApplication來代替。不要創建DispatcherServlet Spring Boot已經爲你和配置Spring MVC做了這些。

@SpringBootApplication 
public class Application extends SpringBootServletInitializer { 

    private static final Class<Application> applicationClass = Application.class; 
    private static final Logger log = LoggerFactory.getLogger(applicationClass); 

    public static void main(String[] args) { 
     SpringApplication.run(applicationClass, args); 
    } 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(applicationClass); 
    }  
} 

您也可以擦亮你的控制器一些,因爲你有@RestController你不需要@ResponseBody

@RestController 
public class MyController { 

    static final Logger logger = Logger.getLogger(MyController.class); 

    @Inject 
    private MyService myService; 

    @RequestMapping(value = "/mytask/{task}", method = RequestMethod.GET, produces = "application/json")   
    public int myTask(@PathVariable String task) { 
     return myService.service(task); 
    } 
} 

最後我會說你的網址是錯誤的。默認情況下,從命令行運行時,應用程序可用作根應用程序,即/,而不是/myservice/mytask/{task}

因此請嘗試curl http://localhost:8080/mytask/123而不是包含應用程序名稱。

如果您希望/myservice成爲URL的一部分,您可以在application.properties中爲您的應用程序指定server.context-path

server.context-path=/myservice 

然後它將被預置爲URL。

+0

很好的解釋Deinum。謝謝 –

0

無需與框架不是圍繞它來傳遞你的[爲MyService名]。使用URL這樣

http://localhost:8080/mytask/somevalue

+0

是的。在發佈問題後,我做了這些工作。 –

+0

@ user8838好大 –

相關問題