Spring MVC Converter 啥时候执行转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring MVC Converter 啥时候执行转换相关的知识,希望对你有一定的参考价值。

参考下面
Converter接口
先来看一下Converter接口的定义:
Java代码
public interface Converter<S, T>

T convert(S source);



可以看到这个接口是使用了泛型的,第一个类型表示原类型,第二个类型表示目标类型,然后里面定义了一个convert方法,将原类型对象作为参数传入进行转换之后返回目标类型对象。当需要建立自己的converter的时候就可以实现该接口。下面假设有这样一个需求,有一个文章实体,在文章中是可以有附件的,而附件需要记录它的请求地址、大小和文件名,所以这个时候文章应该是包含一个附件列表的。在实现的时候附件是实时上传的,上传后由服务端返回对应的附件请求地址、大小和文件名,附件信息不直接存放在数据库中,而是作为文章的属性一起存放在Mongodb中。客户端获取到这些信息以后做一个简单的展示,然后把它们封装成特定格式的字符串作为隐藏域跟随文章一起提交到服务端。在服务端就需要把这些字符串附件信息转换为对应的List<Attachment>。所以这个时候就建立一个String[]到List<Attachment>的Converter。代码如下:
Java代码
import java.util.ArrayList;
import java.util.List;

import org.springframework.core.convert.converter.Converter;

import com.tiantian.blog.model.Attachment;

public class StringArrayToAttachmentList implements Converter<String[], List<Attachment>>

@Override
public List<Attachment> convert(String[] source)
if (source == null)
return null;
List<Attachment> attachs = new ArrayList<Attachment>(source.length);
Attachment attach = null;
for (String attachStr : source)
//这里假设Attachment是以“name,requestUrl,size”的形式拼接的。
String[] attachInfos = attachStr.split(",");
if (attachInfos.length != 3)//当按逗号分隔的数组长度不为3时就抛一个异常,说明非法操作了。
throw new RuntimeException();
String name = attachInfos[0];
String requestUrl = attachInfos[1];
int size;
try
size = Integer.parseInt(attachInfos[2]);
catch (NumberFormatException e)
throw new RuntimeException();//这里也要抛一个异常。

attach = new Attachment(name, requestUrl, size);
attachs.add(attach);

return attachs;


参考技术A Converter接口
我们先来看一下Converter接口的定义:
Java代码
public interface Converter<S, T>

T convert(S source);



我们可以看到这个接口是使用了泛型的,第一个类型表示原类型,第二个类型表示目标类型,然后里面定义了一个convert方法,将原类型对象作为参数传入进行转换之后返回目标类型对象。当我们需要建立自己的converter的时候就可以实现该接口。下面假设有这样一个需求,有一个文章实体,在文章中是可以有附件的,而附件我们需要记录它的请求地址、大小和文件名,所以这个时候文章应该是包含一个附件列表的。在实现的时候我们的附件是实时上传的,上传后由服务端返回对应的附件请求地址、大小和文件名,附件信息不直接存放在数据库中,而是作为文章的属性一起存放在Mongodb中。客户端获取到这些信息以后做一个简单的展示,然后把它们封装成特定格式的字符串作为隐藏域跟随文章一起提交到服务端。在服务端我们就需要把这些字符串附件信息转换为对应的List<Attachment>。所以这个时候我们就建立一个String[]到List<Attachment>的Converter。代码如下:
Java代码
import java.util.ArrayList;
import java.util.List;

import org.springframework.core.convert.converter.Converter;

import com.tiantian.blog.model.Attachment;

public class StringArrayToAttachmentList implements Converter<String[], List<Attachment>>

@Override
public List<Attachment> convert(String[] source)
if (source == null)
return null;
List<Attachment> attachs = new ArrayList<Attachment>(source.length);
Attachment attach = null;
for (String attachStr : source)
//这里假设我们的Attachment是以“name,requestUrl,size”的形式拼接的。
String[] attachInfos = attachStr.split(",");
if (attachInfos.length != 3)//当按逗号分隔的数组长度不为3时就抛一个异常,说明非法操作了。
throw new RuntimeException();
String name = attachInfos[0];
String requestUrl = attachInfos[1];
int size;
try
size = Integer.parseInt(attachInfos[2]);
catch (NumberFormatException e)
throw new RuntimeException();//这里也要抛一个异常。

attach = new Attachment(name, requestUrl, size);
attachs.add(attach);

return attachs;


spring mvc json乱码

    <mvc:annotation-driven>
    	<mvc:message-converters>
    		     <!-- 将StringHttpMessageConverter的默认编码设为UTF-8 -->
			<bean class="org.springframework.http.converter.StringHttpMessageConverter">
		    	<constructor-arg value="UTF-8" />
			</bean>
    	</mvc:message-converters>
    </mvc:annotation-driven>
    

 配置默认转换器的编码格式为UTF-8,源码里是ISO-8859-1

 

-------------------------------

<mvc:annotation-driven>标签开启了13个bean

包含了替换3.1之前的废弃bean

DefaultAnnotationHandlerMapping -> RequestMappingHandlerMapping

AnnotationMethodHandlerAdapter -> RequestMappingHandlerAdapter

AnnotationMethodHandlerExceptionResolver -> ExceptionHandlerExceptionResolver

---------------------------------------13个bean

mvcContentNegotiationManager,
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping,-----------启用了最新的RequestMappingHandlerMapping
mvcCorsConfigurations,
org.springframework.format.support.FormattingConversionServiceFactoryBean#0,
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter,---------启用了最新的RequestMappingHandlerAdapter
mvcUriComponentsContributor,
org.springframework.web.servlet.handler.MappedInterceptor#0,
org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#0,----------启用了最新的ExceptionHandlerExceptionResolver
org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver#0,
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver#0,
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,

以上是关于Spring MVC Converter 啥时候执行转换的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC自定义类型转换器Converter参数解析器HandlerMethodArgumentResolver

为啥自定的springmvc converter不起作用吗

在 Spring MVC 之上使用 Spring WebFlow 啥时候有意义?

Spring MVC学习—Spring数据类型转换机制全解一万字

springmvc用啥接受前端的时间

spring mvc 跟 maven spring mvc 有啥区别