您现在的位置是:首页 > 文章详情

🔥 了解 Solon MVC 的参数注入规则

日期:2024-11-15点击:91

关于 Solon MVC 参数注入,主要尊守以下基本规则:

  • 参数名与请求数据名一一对应。
  • 当对上不上时,会采用整体数据注入(如果接收的是实体)
  • 参数名与请求数据同名时,又想整体注入(如果接收的是实体),可使用 @Body 注解强制标注

1、表单参数注入

请求样本数据:

 GET http://localhost:8080/demo?select=1&select=2&user=noear 

支持单字段注入(要求参数名,与请求数据名一一对应)

 @Controller public class DemoController{ @Mapping("demo") public void demo(String[] select, String user){ } } 

支持整体注入(要求参数名,不能与请求数据名对应)

 public class PostDo{ public String[] select; public String user; } @Controller public class DemoController{ @Mapping("demo") public void demo(PostDo postDo){ //参数名,不能是 select 或 user } @Mapping("demo") public void demo(@Body PostDo user){ //参数名如果与数据名相同。需要使用 @Body 来标明它是接收所有请求数据 } } 

2、结构型参数注入(类似 properties 格式参数)

请求样本数据:

  • ?user.id=1&user.name=noear&user.type[0]=a&user.type[1]=b
  • ?type[]=a&type[]=b
  • ?order[id]=a

此特性,需要引入序列化插件:solon-serialization-properties。规则细节参考“序列化数据注入”。

3、序列化数据注入(比如 json, hessian, protostuff, fury)

请求样本数据:

 POST http://localhost:8080/demo {user:'noear',select:[1,2],data:{code:1,label:'b'}} 

支持单字段注入(要求参数名,与请求数据的一级字段名对应)

 @Controller public class DemoController{ @Mapping("demo") public void demo(String[] select, String user){ } } 

支持整体注入(要求参数名,不能与请求数据的一级字段名对应)

 public class PostDo{ public String[] select; public String user; } @Controller public class DemoController{ @Mapping("demo") public void demo(PostDo postDo){ //参数名,不能是 select 或 user } @Mapping("demo") public void demo(@Body PostDo user){ //参数名如果与数据名相同。需要使用 @Body 来标明它是接收所有请求数据 } } 

支持局部注入(要求参数名,不能与请求数据名对应)

 public class PostDo{ public String[] select; public String user; } public class DataDo{ public int code; public String label; } @Controller public class DemoController{ @Mapping("demo") public void demo(PostDo postDo, String user, DataDo data){ //postDo 接收整体数据,user,data 接收局部数据 } } 

4、关于枚举注入

  • 基本结构的,传入 name 可自动转换
  • 定制结构的,参考下面的“特殊类型”

5、特殊类型的注入转换

  • 表单数据注入时

借助"转换器",比如请求 ?demo=1 要转换成实体 Demo。示例:

 @Component public class DemoConverter implements Converter<String, Demo> { @Override public Demo convert(String value) throws ConvertException { return Demo.parse(value); } } //应用示例(http://....?demo=1。 通过转换器把 1 转为 Demo 实体) @Controller public class DemoController { @Mapping("test") public void test(Demo demo){ } } 
  • 序列化数据注入

这个需要,给序列化组件添加对应的解码器,或者使用其特定的注解或特性。

原文链接:https://www.oschina.net/news/320488
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章