(三)springboot实战——web新特性之函数式实现

前言

本节内容我们主要介绍一下web访问的另一种形式,通过函数式web实现一个restful风格的http请求案例。函数式web是spring5.2之后的一个新特性,可以通过函数去定义web请求的处理流程,使得代码更为简洁,耦合性也降低了。

正文

  • 函数式web的四大核心对象
  • RouterFunction:定义路由信息

  • RequestPredicates:定义请求规则,包括请求参数、请求方式等

  • ServerRequest:封装请求参数

  • ServerResponse:封装响应参数

  • 定义一个函数式web的路由组件WebFunctionConfig配置类
  • 实现代码

    package com.yundi.isbc.config;

    import com.yundi.isbc.handler.PersonHandlerService;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.MediaType;
    import org.springframework.web.servlet.function.RequestPredicates;
    import org.springframework.web.servlet.function.RouterFunction;
    import org.springframework.web.servlet.function.RouterFunctions;
    import org.springframework.web.servlet.function.ServerResponse;

    @Configuration
    public class WebFunctionConfig {

    复制代码
      /**
       * 用户信息管理
       *
       * @param personHandlerService
       * @return
       */
      @Bean
      public RouterFunction<ServerResponse> personRouter(PersonHandlerService personHandlerService) {
          RouterFunction<ServerResponse> personRouterFunction = RouterFunctions.route()
                  .GET("/person/{id}", RequestPredicates.accept(MediaType.ALL), personHandlerService::getPerson)
                  .GET("/persons", personHandlerService::getPersons)
                  .POST("/person", RequestPredicates.accept(MediaType.APPLICATION_JSON), personHandlerService::savePerson)
                  .PUT("/person", RequestPredicates.accept(MediaType.APPLICATION_JSON), personHandlerService::updatePerson)
                  .DELETE("/person/{id}", personHandlerService::deletePerson)
                  .build();
          return personRouterFunction;
      }

    }

  • 在该类中实现了restful风格的请求完成用户管理功能的开发

  • 用户person对象的实体类
  • 用户Person类

    package com.yundi.isbc.entity;

    import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
    import lombok.Data;
    import lombok.experimental.Accessors;

    import java.util.ArrayList;
    import java.util.List;

    @Accessors(chain = true)
    @Data
    public class Person {
    /**
    * id
    */
    private String id;

    复制代码
      /**
       * 名称
       */
      private String name;
    
      /**
       * 年龄
       */
      private Integer age;
    
      /**
       * 手机号
       */
      private String phone;
    
      /**
       * 住址
       */
      private List<Address> addresses = new ArrayList<>();

    }

  • 用户地址类

    package com.yundi.isbc.entity;

    import lombok.Data;
    import lombok.experimental.Accessors;

    @Accessors(chain = true)
    @Data
    public class Address {
    /**
    * 地址名称
    */
    private String addressName;
    }

  • 定义业务实现接口PersonHandlerService
  • 实现代码

    package com.yundi.isbc.handler;

    import jakarta.servlet.ServletException;
    import org.springframework.web.servlet.function.ServerRequest;
    import org.springframework.web.servlet.function.ServerResponse;

    import java.io.IOException;

    public interface PersonHandlerService {
    /**
    * 根据id获取用户信息
    *
    * @param serverRequest
    * @return
    */
    ServerResponse getPerson(ServerRequest serverRequest);

    复制代码
      /**
       * 获取全部用户
       * @param serverRequest
       * @return
       */
      ServerResponse getPersons(ServerRequest serverRequest);
    
      /**
       * 保存用户
       * @param serverRequest
       * @return
       */
      ServerResponse savePerson(ServerRequest serverRequest) throws ServletException, IOException;
    
      /**
       * 更新用户信息
       * @param serverRequest
       * @return
       */
      ServerResponse updatePerson(ServerRequest serverRequest) throws ServletException, IOException;
    
      /**
       * 删除用户
       * @param serverRequest
       * @return
       */
      ServerResponse deletePerson(ServerRequest serverRequest);

    }

  • 定义各功能业务实现接口方法

  • 定义业务实现类PersonHandlerServiceImpl
  • 实现代码

    package com.yundi.isbc.handler.impl;

    import com.yundi.isbc.entity.Address;
    import com.yundi.isbc.entity.Person;
    import com.yundi.isbc.handler.PersonHandlerService;
    import jakarta.servlet.ServletException;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Service;
    import org.springframework.web.servlet.function.ServerRequest;
    import org.springframework.web.servlet.function.ServerResponse;

    import java.io.IOException;
    import java.util.Arrays;

    @Slf4j
    @Service
    public class PersonHandlerServiceImpl implements PersonHandlerService {

    复制代码
      @Override
      public ServerResponse getPerson(ServerRequest serverRequest) {
          log.info("==================获取用户信息==================");
          String id = serverRequest.pathVariable("id");
          log.info("用户id:{}", id);
          return ServerResponse
                  .ok()
                  .body(new Person()
                          .setId("1")
                          .setName("xiaoming")
                          .setAge(18)
                          .setPhone("18288474612")
                          .setAddresses(Arrays.asList(new Address().setAddressName("北京市朝阳区"))));
      }
    
      @Override
      public ServerResponse getPersons(ServerRequest serverRequest) {
          log.info("==================获取全部用户信息==================");
          return ServerResponse
                  .ok()
                  .body(Arrays.asList(new Person()
                          .setId("1")
                          .setName("xiaoming")
                          .setAge(18)
                          .setPhone("18288474612")
                          .setAddresses(Arrays.asList(new Address().setAddressName("北京市朝阳区")))));
      }
    
      @Override
      public ServerResponse savePerson(ServerRequest serverRequest) throws ServletException, IOException {
          log.info("==================保存用户信息==================");
          Person person = serverRequest.body(Person.class);
          log.info("用户信息:{}", person);
          return ServerResponse.ok().build();
      }
    
      @Override
      public ServerResponse updatePerson(ServerRequest serverRequest) throws ServletException, IOException {
          log.info("==================更新用户信息==================");
          Person person = serverRequest.body(Person.class);
          log.info("用户信息:{}", person);
          return ServerResponse.ok().build();
      }
    
      @Override
      public ServerResponse deletePerson(ServerRequest serverRequest) {
          log.info("==================删除用户信息==================");
          String id = serverRequest.pathVariable("id");
          log.info("用户id:{}", id);
          return ServerResponse.ok().build();
      }

    }

  • 具体业务实现

  • 启动项目访问测试
  • 获取用户信息
  • 获取用户全部信息
  • 保存用户信息

- 更新用户信息

- 删除用户信息

结语

关于web新特性之函数式实现的相关内容到这里就结束了,我们下期见。。。。。。

相关推荐
汤姆yu30 分钟前
基于springboot的快递分拣管理系统
java·spring boot·后端
你知道烟火吗4 小时前
谈谈对反射的理解?
java·开发语言·spring boot·后端
it自4 小时前
Redisson在Spring Boot项目中的集成与实战
java·spring boot·redis·后端·缓存
我命由我123455 小时前
Spring Boot 项目问题:Web server failed to start. Port 5566 was already in use.
java·前端·jvm·spring boot·后端·spring·java-ee
热河暖男8 小时前
Spring Boot AI 极速入门:解锁智能应用开发
java·人工智能·spring boot·ai编程
苦学编程的谢9 小时前
SpringBoot统一功能处理
java·spring boot·后端
旋风菠萝19 小时前
JVM易混淆名称
java·jvm·数据库·spring boot·redis·面试
weisian15120 小时前
Java WEB技术-序列化和反序列化认识(SpringBoot的Jackson序列化行为?如何打破序列化过程的驼峰规则?如何解决学序列化循环引用问题?)
java·spring boot
橘子编程21 小时前
SpringMVC核心原理与实战指南
java·spring boot·spring·tomcat·mybatis