- 基本类型绑定
public class UserBean {
private int in;
private long lo;
private byte by;
private char ca;
private double do;
private boolean bo;
private String str;
// get,set...
}
// 定义Action
@ResponseBody
@RequestMapping("/addUser")
public Object addUser(UserBean bean) {
System.err.println(JSON.toJSON(bean));
return bean;
}
// 测试请求
@Test
public void testAddUser() throws Exception{
MockHttpServletRequestBuilder mb = MockMvcRequestBuilders.post("/param/addUser").accept(MediaType.parseMediaType("application/json;charset=UTF-8"));
mb.param("in", "100");
mb.param("lo", "100");
mb.param("by", "100");
mb.param("ca", "a");
mb.param("do", "100");
mb.param("bo", "1");
mb.param("str", "luck");
ResultActions ra = sendRequest(mb);
MockHttpServletResponse response = ra.andReturn().getResponse();
System.out.println(response.getContentAsString());
ra.andDo(MockMvcResultHandlers.log());
}
// 打印结果
{"str":"luck","bo":true,"do":100,"by":100,"in":100,"lo":100,"ca":"a"}
/**
* 当一个基本类型的传入参数有多个是会报错
* 只有String类型的多个类型是会自动拼接 str1,str2,str3,...
*/
- 数组集合绑定
// 定义bean
public class CollectionBean {
private String[] array;
private List<String> list;
private Set<String> set;
private Map<String, String> map;
// get,set...
}
// 定义action
@ResponseBody
@RequestMapping("/testCollections")
public Object testCollections(CollectionBean bean) {
System.err.println(JSON.toJSON(bean));
return bean;
}
// 测试方法
@Test
public void testCollections() throws Exception{
MockHttpServletRequestBuilder mb = MockMvcRequestBuilders.post("/param/testCollections").accept(MediaType.parseMediaType("application/json;charset=UTF-8"));
mb.param("array", "100");
mb.param("array", "101");
mb.param("array", "102");
mb.param("list", "LIST100001");
mb.param("list", "LIST100002");
mb.param("list", "LIST100003");
mb.param("list", "LIST100004");
mb.param("set", "aaa");
mb.param("set", "aaa");
mb.param("set", "aaa");
mb.param("map[x]", "xxxx");
mb.param("map[y]", "yyyy");
mb.param("map[z]", "zzzz");
ResultActions ra = sendRequest(mb);
MockHttpServletResponse response = ra.andReturn().getResponse();
System.out.println(response.getContentAsString());
ra.andDo(MockMvcResultHandlers.log());
}
// 打印结果
{"set":["aaa"],"list":["LIST100001","LIST100002","LIST100003","LIST100004"],"array":["100","101","102"],"map":{"x":"xxxx","y":"yyyy","z":"zzzz"}}
/**
* 集合接口的默认实现
* List -> ArrayList
* Set -> LinkedHashSet (有序)
* Map -> LinkedHashMap (有序)
* 若不想用默认实现,需在无参构造器中初始化
* 如想使用HashMap,如下即可
* public CollectionBean() {
* map = new HashMap<String, String>();
* }
**/
- 对象,对象数组,对象集合
// bean
public class OneBean {
private int age;
private String name;
// get,set...
}
public class TwoBean {
private String text;
private OneBean[] ones;
private List<OneBean> oneList;
private Map<String, OneBean> beanMap;
// get,set...
}
// action
@ResponseBody
@RequestMapping("/testObjectO")
public Object testObjectO(TwoBean bean) {
System.err.println(JSON.toJSON(bean));
return bean;
}
// test
@Test
public void testObjectO() throws Exception{
MockHttpServletRequestBuilder mb = MockMvcRequestBuilders.post("/param/testObjectO").accept(MediaType.parseMediaType("application/json;charset=UTF-8"));
mb.param("text", "I am twoBean");
mb.param("ones[0].age", "100");
mb.param("ones[0].name", "zhangsan");
mb.param("ones[1].age", "100");
mb.param("ones[1].name", "lisi");
mb.param("oneList[0].age", "100");
mb.param("oneList[0].name", "wangwu");
mb.param("oneList[1].age", "100");
mb.param("oneList[1].name", "wugui");
mb.param("beanMap[x].age", "100");
mb.param("beanMap[x].name", "wugui");
mb.param("beanMap[y].age", "100");
mb.param("beanMap[y].name", "wugui");
ResultActions ra = sendRequest(mb);
MockHttpServletResponse response = ra.andReturn().getResponse();
System.out.println(response.getContentAsString());
ra.andDo(MockMvcResultHandlers.log());
}
// 打印结果
{"oneList":[{"name":"wangwu","age":100},{"name":"wugui","age":100}],"ones":[{"name":"zhangsan","age":100},{"name":"lisi","age":100}],"beanMap":{"x":{"name":"wugui","age":100},"y":{"name":"wugui","age":100}},"text":"I am twoBean"}
-
枚举等自定义参数PropertyEditor
-
// 自定义参数需要自己定义参数编辑器
// bean
public enum TypeEnum {
ADD("1", "新增"),
UPDATE("2", "修改"),
DELETE("3", "删除"),
SELECT("4", "查询");
private String value;
private String desc;
TypeEnum(String value, String desc){
this.value = value;
this.desc = desc;
}
}
public class EnumBean {
private TypeEnum typeEnum;
private TypeEnum[] types;
}
// editHandler
public class EnumBeanEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
if(!StringUtils.isEmpty(text)) {
setValue(TypeEnum.map.get(text.trim()));
}else {
super.setAsText(text);
}
}
}
// action
@InitBinder
public void bind(WebDataBinder binder) {
binder.registerCustomEditor(TypeEnum.class, new EnumBeanEditor());
}
@ResponseBody
@RequestMapping("/testEnum")
public Object testEnum(EnumBean bean) {
System.err.println(bean.getTypeEnum());
for(TypeEnum e : bean.getTypes()) {
System.err.println(e);
}
return bean;
}
// test
@Test
public void testEnum() throws Exception{
MockHttpServletRequestBuilder mb = MockMvcRequestBuilders.post("/param/testEnum").accept(MediaType.parseMediaType("application/json;charset=UTF-8"));
mb.param("typeEnum", "1");
mb.param("types", "1");
mb.param("types", "1");
mb.param("types", "3");
ResultActions ra = sendRequest(mb);
MockHttpServletResponse response = ra.andReturn().getResponse();
System.out.println(response.getContentAsString());
ra.andDo(MockMvcResultHandlers.log());
}
// 打印结果
value:1 desc:新增
value:1 desc:新增
value:1 desc:新增
value:3 desc:删除
/**
* 枚举转JSON
* 返回前台结果为{"typeEnum":"ADD","types":["ADD","ADD","DELETE"]}
* 若要枚举的value值,需在getValue的方法的增加注解
* @com.fasterxml.jackson.annotation.JsonValue
* public String getValue()
* 结果就为{"typeEnum":"1","types":["1","1","3"]}
看了这么多,大概知道如何自定义数据转换了吧 。下面介绍两种不常用的
-
- 使用Converter接口扩展 Spring 提供了三个转换接口,用法类似,此处仅展示最常用的 org.springframework.core.convert.converter.Converter 示例
public class EnumConvert implements Converter<String, TypeEnum> {
@Override
public TypeEnum convert(String source) {
System.out.println(source);
return TypeEnum.map.get(source);
}
}
配置文件修改
<!-- mvn注解驱动指定转换服务 -->
<mvc:annotation-driven conversion-service="conversionService" />
...
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 转换器 -->
<property name="converters">
<list>
<bean class="com.xquant.common.mock.editer.EnumConvert"/>
</list>
</property>
</bean>
- 组件扩展转换器
因大多数转换都是从String转换为Object,略微抽象了一下,使用时直接继承抽象接口即可。然后扩展了FormattingConversionServiceFactoryBean类,组件内部转换器直接代码中引用,外部转换器可在转换服务的属性注入即可
--转换器
public class TradeTypeConverter extends AbstractConverter<TradeTypeEnum> {
@Override
public TradeTypeEnum convert(String source) {
if(StringUtils.isNotBlank(source)){
return TradeTypeEnum.getTradeTypeEnum(source.trim());
}
return null;
}
}
public class CustomConversionService {
...
<!-- 组件内部转换器 -->
private void addSupportCustomConverter(Set<Object> set){
set.add(new TradeTypeConverter());
}
xml配置
<mvc:annotation-driven conversion-service="customConversionService" />
<!-- Spring-servlet.xml 配置 -->
<bean id="customConversionService" class="com.xquant.platform.component.javascript.mvc.convert.conversion.CustomConversionService" >
<!-- 项目点转换器 -->
<property name="converters">
<list>
<bean class="com.xquant.common.mock.editer.EnumConvert"/>
</list>
</property>
</bean>
spring mvc对象属性绑定
最新推荐文章于 2019-11-13 16:03:36 发布