java - Spring Rest API 与 WebApp

标签 java spring rest

我刚刚遵循了这个教程 https://spring.io/guides/tutorials/react-and-spring-data-rest/

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

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

谢谢!

最佳答案

你可以Spring mvc

@Configuration
@EnableWebMvc
public class WebConfig{
   //
}

@EnableWebMvc 注释做了许多有用的事情 - 具体来说,在 REST 的情况下,它检测类路径上是否存在 Jackson 和 JAXB 2 并自动创建和注册默认的 JSON 和 XML 转换器。

@Controller 是 RESTful API 整个 Web 层的中心工件。出于本文的目的, Controller 正在对一个简单的 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 实现是非公开的——这是因为它不需要如此。通常, Controller 是依赖链中的最后一个——它从 Spring 前端 Controller (DispathcerServlet)接收 HTTP 请求,然后将它们简单地委托(delegate)给服务层。如果没有必须通过直接引用注入(inject)或操作 Controller 的用例,那么我宁愿不将其声明为公共(public)。

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

Spring 数据 让我们看看IFooService,它在我们的 Controller 中用于基本的curd操作

IFooService.java

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

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

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

findAll,findOne,save, delete

我们没有在 IFooService 中提供这些方法的实现 ,实际上,这些方法来自 CrudRepository 意味着 curd 操作是由 spring data 处理的,这节省了很多时间 hereCrudRepository 文档,您还可以从 here 学到很多关于 Spring 数据的知识。

关于java - Spring Rest API 与 WebApp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44374532/

相关文章:

java - 简化了数字范围文件夹检查的大量 if 语句

java - 无法在 Eclipse 中从 wsdl 和 xsd 文件生成 java 文件

java - 是否有任何开源 “MSWord doc to PDF” 转换库可用

java - spring中从环境变量指定的路径加载属性文件

java - 大量表和 Hibernate 内存消耗

java - Spring Boot应用程序中的Hadoop distcp-ClassNotFoundException

spring - @Transactional 和 JPA 对象参数

java - 如何在同一端口托管 SOAP 服务和 REST 服务?

Django 测试休息框架 : APIRequestFactory vs APIClient

api - 如何将 Twitter API 用于超过 REST 速率限制的大型 Web 应用程序