2021-01-06控制层请求入参包含枚举类型时序列化的一点问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-01-06控制层请求入参包含枚举类型时序列化的一点问题相关的知识,希望对你有一定的参考价值。

参考技术A controller请求入参实体类中包含枚举类型字段,调用接口时,如果入参实体类该枚举值对应字段为数字,则会映射到枚举对应的字段上,从0开始。

例如  

@postmapping("/test")

public void test (@requestbody TestRequest req)

    system.out.println(req.value);



@Data

public class TestRequest

 private String key;

private TestEnum value;



public enum TestEnum

A(),

B(),

C();



请求入参

 

"key":"xxx",

"value":"0"



此处 value会被映射为TestEnum.A 。如果数字超出枚举字段量,则会报无法转换的异常

SpringMVC

  1. 首先什么是MVC

MVC包含Model(模型层)、View(视图层)、Controller(控制层)三层,用户发送请求到Controller,Controller层接受请求、转发请求,委托Model层进行数据处理,Model层(模型层)处理请求,将结果返回给Controller层,Controller层将试图渲染交给View层完成, View返回jstl到Controller,Controller响应结果给用户。

 技术图片

 

2. SpringMVC是什么?

SpringMVC是一个web层的MVC框架,是Spring的一部分。

3. SpringMVC的执行过程

用户根据地址访问到web.xml中配置好的前端控制器(DispatcherServlet),前端控制器根据请求找到对应的处理器映射器(HandlerMapping),处理器映射器返回chain给前端控制器;再由前端控制器请求执行Controller,这一步首先通过由处理器映射器获取的chain找到处理器适配器(ControllerHandlerAdapter),由处理器适配器执行Controller并且返回ModelAndView到前端控制器;前端控制器将ModelAndView交给视图解析器(ViewResolver)解析视图,视图解析器将View传给前端控制器再交予View层进行渲染视图,最终响应用户。

4. 处理器映射器

4.1 BeanNameUrlHandlerMapping

功能:寻找Controller

         根据url请求去匹配bean的name属性url,从而获取Controller

 

4.2 SimpleUrlHandlerMaping

功能:寻找Controller

         根据浏览器url匹配简单url的key,key又Controller的id找到Controller

 

4.3 ControllerClassNameHandlerMapping

功能:寻找Controller

          根据类名(MyController)类名.do来访问,类名首字母小写

 

5. 处理器适配器

5.1   SimpleControllerHandlerAdapter

功能:执行controller

         调用controller里面方法,返回modelAndView。

5.2 HttpRequestHandlerAdapter

功能:执行controller

 

 

6.配置web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">

  <display-name>springMVC_01_self</display-name>

    <servlet>

    <servlet-name>springmvc</servlet-name>

    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <!-- 如果将配置文件的名字写成:springmvc-servlet.xml,核心控制器可以自动找到并执行

        1.名字必须是springmvc-servlet.xml   2.配置文件必须放在WEB-INF下面

     -->

    <init-param>

        <!-- 7.核心控制器会根据contextConfigLocation自动查找配置文件并执行 -->

        <param-name>contextConfigLocation</param-name>

        <param-value>classpath:springmvc.xml</param-value>

    </init-param>

  </servlet>

  <servlet-mapping>

  <servlet-name>springmvc</servlet-name>

  <!-- 在控制寻找具体的controller的时候,可以把它类似看成过滤器,但是不会自动触发

    这里不能写/*等控制范围太广的路径  ,核心控制器在进行捕获路径的时候,存在一些静态的文件,如果写成/*,同样会被捕获,

    但是这些文件在springmvc1.xml并没有去设置相应的对象.所以会报404

    最好使用:*.do   *.ok    *.haha

     -->

  <url-pattern>*.do</url-pattern>

  </servlet-mapping>

 

  <welcome-file-list>

    <welcome-file>index.html</welcome-file>

    <welcome-file>index.htm</welcome-file>

    <welcome-file>index.jsp</welcome-file>

    <welcome-file>default.html</welcome-file>

    <welcome-file>default.htm</welcome-file>

    <welcome-file>default.jsp</welcome-file>

  </welcome-file-list>

</web-app>

7. 配置springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:context="http://www.springframework.org/schema/context"

       xsi:schemaLocation="http://www.springframework.org/schema/beans

                           http://www.springframework.org/schema/beans/spring-beans.xsd

                           http://www.springframework.org/schema/context

                           http://www.springframework.org/schema/context/spring-context.xsd">

<!-- 1.导入相关的约束文件 -->

<!-- 2.再web.xml配置前端控制器 -->

<!-- 3.寻找Controller-BeanNameUrlHandlerMapping(处理器的映射器)-->

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>

 <!-- 5.通过bean的方式创建Controller的对象  name:就是访问路径 -->

<bean name="/test.do"  class="com.qianfeng.web.TestController"></bean>

<!-- 6.执行Controller,让他工作

通过 SimpleControllerHandlerAdapter实现(处理器适配器) -->

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>

 

 <!-- 8.配置返回视图的信息

这里对返回视图的配置要与Controller页面的逻辑视图配合

 -->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

    <!-- 设置前缀后缀 -->

    <property name="prefix" value="/"></property>

    <property name="suffix" value=".jsp"></property>

</bean>

</beans>

8.  通过注解方式配置web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">

  <!-- 设置编码 -->

  <filter>

    <filter-name>encodingFilter</filter-name>

    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

    <init-param>

        <param-name>encoding</param-name>

        <param-value>UTF-8</param-value>

    </init-param>

  </filter>

  <filter-mapping>

    <filter-name>encodingFilter</filter-name>

    <url-pattern>/*</url-pattern>

  </filter-mapping>

  <display-name>J2EE_Email_SSM</display-name>

  <!-- spring的applicationContext.xml文件路径的配置放在这里、全局的配置文件name必须是contextConfigLocation -->

  <context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>classpath:spring/applicationContext.xml</param-value>

  </context-param>

  <!-- 执行applicationContext.xml,监听器只要发现配置了这个文件,就会自动执行这个文件 -->

  <listener>

    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

  </listener>

  <!-- 配置sessionlistener获取当前在线人数 -->

  <listener>

    <listener-class>com.swpu.listener.MyListener</listener-class>

  </listener>

  <!-- 前端控制器 -->

  <servlet>

    <servlet-name>springmvc</servlet-name>

    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <init-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>classpath:spring/springmvc.xml</param-value>

    </init-param>

  </servlet>

  <servlet-mapping>

    <servlet-name>springmvc</servlet-name>

    <url-pattern>*.do</url-pattern>

    <url-pattern>*.test</url-pattern>

  </servlet-mapping>

  <welcome-file-list>

    <welcome-file>index.html</welcome-file>

    <welcome-file>index.htm</welcome-file>

    <welcome-file>index.jsp</welcome-file>

    <welcome-file>default.html</welcome-file>

    <welcome-file>default.htm</welcome-file>

    <welcome-file>default.jsp</welcome-file>

  </welcome-file-list>

</web-app>

9. 通过注解方式配置springmvc.xml

  <!-- 扫描注释-->

<context:component-scan base-package="com.swpu"></context:component-scan>

<!-- 自动生成映射器和适配器对象 -->

<mvc:annotation-driven></mvc:annotation-driven>

<!-- 配置视图解析器 -->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

    <property name="prefix" value="/"></property>

    <property name="suffix" value=".jsp"></property>

</bean>

  1. 实例

10.1       结构

 技术图片

 

10.2       service层的注解

 技术图片

 

10.3       Controller层的注解

 技术图片

 

以上是关于2021-01-06控制层请求入参包含枚举类型时序列化的一点问题的主要内容,如果未能解决你的问题,请参考以下文章

OC 接口入参类型为 array, 请求类型为 delete 该如何传值

Django实现请求方法和必传参数校验

Springboot接口多个DTO入参的Postman上传方式

源码篇Spring MVC多种请求入参处理方式都在这了(@RequestParam@PathVariable@RequestBodyMapJavaModelRequest基础类型)

AOP注解实现日志收集

网络七层协议