2017-06-05 64 views
0

春天REST API我只是跟着這個教程 https://spring.io/guides/tutorials/react-and-spring-data-rest/與Web應用程序

而且這真的很有趣,但我想知道怎樣才能創建相同的應用程序,而無需使用彈簧啓動,我想它在Tomcat Web容器部署。

在癮我想也到上下文路徑添加到應用程序將在本地主機上運行:8080/APPNAME /應用程序和API將本地主機上運行:8080/APPNAME /網絡

謝謝!

+0

嘗試查看此https://docs.spring.io/docs/Spring-MVC-step-by-step/part1.html –

+0

是否要將其部署到Tomcat容器中而不使用Spring引導?因爲如果問題只是在Tomcat中部署它,您還可以使用「spring-boot-maven-plugin」將Spring引導應用程序打包爲war而不是jar,並將其部署到Tomcat中,而不會出現任何問題。 –

+0

好吧,也許這個問題有點不對,事實是我想用'CrudRepository '和'PagingAndSortingRepository '接口部署我的web應用程序後端,以加速我的開發並避免編碼大量的樣板文件碼。 前端將使用Reat + Weback + redux進行開發。 我也認爲春季啓動向我的應用程序添加了大量無用的代碼(一個Web容器實現),因爲它必須部署到容器中,不是嗎? –

回答

1

你行你的Spring MVC

@Configuration 
@EnableWebMvc 
public class WebConfig{ 
    // 
} 

@EnableWebMvc註釋做了一些有益的事情 - 具體而言,在靜止的情況下,檢測到類路徑 並自動創建傑克遜和JAXB 2的存在並註冊默認的JSON和XML轉換器。

@Controller是RESTful API的整個Web層中的中心工件。對於這篇文章的目的,控制器造型簡單的REST資源 - 美孚:

@Controller 
    @RequestMapping(value = "/foos") 
     class FooController{ 
      @Autowired 
      IFooService service; 

      @RequestMapping(method = RequestMethod.GET) 
      @ResponseBody 
      public List<Foo> findAll(){ 
       return service.findAll(); 
      } 

      @RequestMapping(value = "/{id}", method = RequestMethod.GET) 
      @ResponseBody 
      public Foo findOne(@PathVariable("id") Long id){ 
       return RestPreconditions.checkFound(service.findOne(id)); 
      } 

      @RequestMapping(method = RequestMethod.POST) 
      @ResponseStatus(HttpStatus.CREATED) 
      @ResponseBody 
      public Long create(@RequestBody Foo resource){ 
       Preconditions.checkNotNull(resource); 
       return service.save(resource); 
      } 

      @RequestMapping(value = "/{id}", method = RequestMethod.PUT) 
      @ResponseStatus(HttpStatus.OK) 
      public void update(@PathVariable("id") Long id, @RequestBody Foo resource){ 
       Preconditions.checkNotNull(resource); 
       RestPreconditions.checkNotNull(service.findOne(resource.getId())); 
//update logic 
       service.save(resource); 
      } 

      @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) 
      @ResponseStatus(HttpStatus.OK) 
      public void delete(@PathVariable("id") Long id){ 
       service.delete(id); 
      } 

     } 

的控制器實現非公開 - 這是因爲它並不需要的人。通常,控制器是依賴關係鏈中的最後一個 - 它接收來自Spring前端控制器(DispathcerServlet)的HTTP請求,並簡單地將它們轉發給服務層。如果沒有控制器必須通過直接引用被注入或操縱的用例,那麼我寧願不宣稱它是公開的。

請求映射很簡單 - 與任何控制器一樣,映射的實際值以及HTTP方法用於確定請求的目標方法。 @RequestBody將方法的參數綁定到HTTP請求的主體,而@ResponseBody對響應和返回類型也是如此。他們還確保使用正確的HTTP轉換器對資源進行編組和解組。內容協商將主要基於Accept頭來選擇使用哪一個活動轉換器,儘管其他HTTP頭也可用於確定表示。 這裏是有幫助tutorial

春數據 讓我們來看看IFooService,它在我們的控制器用於基本curd operation

IFooService.java

public interface IFooService extends CrudRepository<Foo, Long> { 
} 

春數據保存我們的生活,春天的數據一個高級別的SpringSource項目,其目的是統一併簡化對不同類型的持久存儲(關係數據庫系統和NoSQL數據存儲)的訪問。

這裏IFooService擴展了CrudRepository,我們將Foo作爲實體進行傳遞,將Long作爲泛型參數中的Foo id類型。 如果將在FooController IFooService看到的是自動裝配和我們使用的有以下幾種方法:

的findAll,findOne,保存,刪除

我們不以IFooService 已經提供了這些方法的實現,實際上,這些方法來自CrudRepository意思是凝乳操作正在處理的春季數據很省時間hereCrudRepository doc也可以學到很多關於春季數據的信息here

+0

這是非常好的實現,但我必須用這種方式編寫大量的樣板代碼。事實是,我想使用'CrudRepository '和'PagingAndSortingRepository '接口來暴露我的API,以加速我的開發速度。 –

+0

@LorenzoDeFrancesco yes CrudRepository是春季資料的一部分,我在回覆中更新了春季資料圖片中的服務部分,請看看 –

+0

太棒了,我明白了! 但是如何控制器,是否可以在不寫控制器的情況下以標準方式公開我的服務? –