2017-06-05 63 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

太棒了,我明白了! 但是如何控制器,是否可以在不写控制器的情况下以标准方式公开我的服务? –