【问题标题】:Spring Rest API with WebApp带有 WebApp 的 Spring Rest API
【发布时间】:2017-11-06 13:22:01
【问题描述】:

我只是按照这个教程 https://spring.io/guides/tutorials/react-and-spring-data-rest/

这真的很有趣,但我想知道如何在不使用 spring boot 的情况下创建相同的应用程序,我想将它部署在 tomcat web 容器中。

我还想添加一个上下文路径,应用程序将在 localhost:8080/appName/app 上运行,而 api 将在 localhost:8080/appName/web 上运行

谢谢!

【问题讨论】:

  • 你想将它部署在 Tomcat 容器中而不是使用 Spring-boot 吗?因为如果问题只是将它部署在 Tomcat 中,您还可以使用“spring-boot-maven-plugin”将 Spring-boot 应用程序打包为 war 而不是 jar,并将其部署在 Tomcat 中没有任何问题。
  • 好吧,也许问题有点不对劲,事实是我想使用CrudRepository<T,ID>PagingAndSortingRepository<T, ID extends Serializable> 接口部署我的Web 应用程序后端,以加快我的开发速度并避免编写大量样板代码.前端将使用 Reat + Weback + redux 开发。我还认为 Spring Boot 向我的应用程序添加了许多无用的代码(Web 容器实现),因为它必须部署到容器中,不是吗?
  • 我无法在使用 CrudRepository 和不使用 Spring-boot 之间建立联系。 CrudRepository 是 spring-boot 核心中包含的 spring-data 的一部分。 Spring-boot 旨在减少样板文件,它不包含 Web 容器,它只有一个可以使用或不使用的嵌入式 Tomcat 或 Jetty(使用它实际上可以加快您的开发和部署,因为您只需创建 jar 和运行它,无需自己设置和配置 Tomcat)。您编写应用程序的方式,使用或不使用 CrudRepository 等接口,与使用或不使用 spring-boot 框架无关。
  • 感谢您的解释,您能否提供一个示例或教程,说明如何在 tomcat 中部署我的应用程序?上下文路径呢,我可以为 api 和前端定义它吗?

标签: java spring rest


【解决方案1】:

你可以使用 Spring mvc

@Configuration
@EnableWebMvc
public class WebConfig{
   //
}

@EnableWebMvc 注释做了很多有用的事情——特别是,在 REST 的情况下,它检测到类路径中 Jackson 和 JAXB 2 的存在 并自动创建和注册默认的 JSON 和 XML 转换器。

@Controller 是 RESTful API 的整个 Web 层中的核心构件。出于本文的目的,控制器正在建模一个简单的 REST 资源 - Foo:

    @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 );
           }

        }

Controller 实现是非公开的——这是因为它不需要公开。通常,控制器是依赖链中的最后一个——它从 Spring 前端控制器(DispathcerServlet)接收 HTTP 请求,并将它们简单地委托给服务层。如果没有必须通过直接引用注入或操作控制器的用例,那么我宁愿不将其声明为公共的。

请求映射很简单——与任何控制器一样,映射的实际值以及 HTTP 方法用于确定请求的目标方法。 @RequestBody 将方法的参数绑定到 HTTP 请求的主体,而 @ResponseBody 对响应和返回类型执行相同的操作。他们还确保使用正确的 HTTP 转换器对资源进行编组和解组。将进行内容协商以选择将使用哪一个活动转换器,主要基于 Accept 标头,尽管也可以使用其他 HTTP 标头来确定表示形式。 这里很有帮助tutorial

春季数据 让我们看看IFooService,它在我们的控制器中用于基本curd operation

IFooService.java

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

Spring Data 拯救了我们的生命,Spring Data 是一个高级 SpringSource 项目,其目的是统一和简化对不同类型持久性存储的访问,包括关系数据库系统和 NoSQL 数据存储。

这里IFooService 扩展了 CrudRepository,我们将 Foo 作为实体传递,Long 作为泛型参数中的 Foo id 类型传递。 如果您将在FooController 中看到 IFooService 是自动装配的,我们正在使用以下方法:

findAll,findOne,保存,删除

IFooService中没有提供这些方法的实现 ,实际上,这些方法来自 CrudRepository 意味着 curd 操作是由 spring 数据处理的,这节省了很多时间 hereCrudRepository doc 你也可以从 here 了解很多关于 spring 数据的信息

【讨论】:

  • 这是非常好的实现,但我必须以这种方式编写大量样板代码。事实上,我想使用 CrudRepository&lt;T,ID&gt;PagingAndSortingRepository&lt;T, ID extends Serializable&gt; 接口公开我的 API 以加快我的开发速度。
  • @LorenzoDeFrancesco 是的 CrudRepository 是 spring 数据的一部分,我已经更新了我的答案中的服务部分,其中 Spring 数据出现在图片中,请看一下
  • 太好了,我明白了!但是控制器呢,是否可以在不编写控制器的情况下以标准方式公开我的服务?
  • 您可以将 REST 与 Java (JAX-RS) 结合使用,将 Jersey 与 spring 数据一起使用,或者 Spring 为 Rest api 提供 @RestController,因此您也可以将 RestController 与 spring 数据一起使用 docs.spring.io/spring/docs/current/javadoc-api/org/…
猜你喜欢
  • 2020-08-09
  • 2015-06-15
  • 2017-01-04
  • 1970-01-01
  • 2016-01-24
  • 2018-04-18
  • 2021-11-07
  • 2016-03-05
  • 1970-01-01
相关资源
最近更新 更多