Jboot v3.6.9 发布,功能超级强大的 @JsonBody

Jboot 是一个基于 JFinal、JFinal-Undertow、Dubbo、Seata、Sentinel、ShardingSphere、Nacos 等开发的微服务框架,帮助开发者降低微服务开发门槛。同时完美支持在 idea、eclipse 下多 maven 模块,对 java 代码、html、css、js 等资源文件进行热加载。爽爽开发,快乐生活。

到目前为止,Jboot 已经开源超过了 4 年的时间,迭代了 160+ 个版本,已经被超过 1000+ 公司在使用,其中包含了多个知名的上市公司。

Jboot V3.6.9 主要增强 Jboot 和前端 Json 的交互与渲染能力,体现在新增了 @JsonBody 注解用于接收前端的的 Json 数据和重构 ErrorRender ,在程序发生错误的时候能够给到前端友好的体验。

@JsonBody 的功能非常强大,比如,前端传入的 Json 内容如下:

[1,2,3]

 如下的方法都可以正常接收数据:

public void method1(@JsonBody() int[] beans) {        
     System.out.println("beans--->" + beans);        
     renderText("ok");
} 

public void method2(@JsonBody() String[] beans) {        S
    ystem.out.println("beans--->" + beans);        r
    enderText("ok");
} 
public void method3(@JsonBody() List beans) {        
    System.out.println("beans--->" + beans);        
    renderText("ok");
} 

public void method4(@JsonBody() Set beans) {        
    System.out.println("beans--->" + beans);        
    renderText("ok");
} 

public void method5(@JsonBody() List<Integer> beans) {        
    System.out.println("beans--->" + beans);        
    renderText("ok");
} 

public void method6(@JsonBody() Set<Integer> beans) {        
    System.out.println("beans--->" + beans);        
    renderText("ok");
} 

public void method7(@JsonBody() List<String> beans) {        
    System.out.println("beans--->" + beans);        
    renderText("ok");
} 

public void method8(@JsonBody() Set<String> beans) {        
    System.out.println("beans--->" + beans);        
    renderText("ok");
}

如果前端传入的是如下的 Json 数据:

{  
"aaa":{      
        "bbb":[1,2,3]
      }
}

只需要在 @JsonBody 添加对应的前缀即可,比如:

 public void method1(@JsonBody("aaa.bbb") int[] beans) {        
     System.out.println("beans--->" + beans);        
     renderText("ok");
}

对 Java Bean 的支持也是非常友好的,比如 MyBean 的代码如下:

public class MyBean {    
    private String id;    
    private int age;    
    private BigInteger amount;    
    //getter setter
}

前端传入数据如下:

{  "aaa":{     
        "bbb":{         
            "id":"abc",         
            "age":17,         
            "amount":123
      }
   }
 }

Controller 后端接收代码如下:

public void bean(@JsonBody("aaa.bbb") MyBean bean) {    
    System.out.println("bean--->" + bean);    
    renderText("ok");
}

或者,后端也可以直接使用一个 Map 来接收:

 public void map(@JsonBody("aaa.bbb") Map map) {        
     System.out.println("map--->" + map);        
     renderText("ok");
}

使用 Map 接收也可以直接指定 Map 的数据类型:

  public void map(@JsonBody("aaa.bbb") Map<String, String> map) {        
      System.out.println("map--->" + map);        
      renderText("ok");
  }

或者,我们只接受单个值:

 public void id(@JsonBody("aaa.bbb.id") String id) {        
      System.out.println("id--->" + id);        
      renderText("ok");
  }


 public void age1(@JsonBody("aaa.bbb.age") int age1) {        
      System.out.println("age1--->" + age1);        
      renderText("ok");
  }


直接使用 String、BigInteger、Long、float  接受 int,自动会进行强转。

 public void age2(@JsonBody("aaa.bbb.age) String age2) {        
      System.out.println("age2--->" + age2);        
      renderText("ok");
  }
 public void age3(@JsonBody("aaa.bbb.age) BinInteger age3) {        
      System.out.println("age3--->" + age3);        
      renderText("ok");
  }


倘若前端传入的是 Bean 数组,例如:

{    
"aaa":{        
    "bbb":[
            {                
            "id":"abc",                
            "age":17,                
            "amount":123
            },
            {                
            "id":"abc",                
            "age":17,                
            "amount":123
            }
        ]
    }
}

后端可以通过如下的方式进行接收数据,例如:

  public void list(@JsonBody("aaa.bbb") List<MyBean> list) {        
      System.out.println("list--->" + list);        
      renderText("ok");
  }

或者

public void set(@JsonBody("aaa.bbb") Set<MyBean beans) {        
    System.out.println("array--->" + beans);        
    renderText("ok");
}

或者

public void array(@JsonBody("aaa.bbb") MyBean[] beans) {        
    System.out.println("array--->" + beans);        
    renderText("ok");
}

@JsonBody 还有更多的支持,篇幅有限不再一一举例。

 

Jboot 主要有以下特征:

  • 1、基于 JFinal 的 MVC + ORM 快速开发

  • 2、基于 ShardingSphere + Seata 分布式事务 和 分库分表

  • 3、基于 Dubbo 或 Motan 的 RPC 实现

  • 4、基于 Sentinel 的分布式限流和降级

  • 5、基于 Apollo 和 Nacos 的分布式配置中心

  • 6、基于 EhCache 和 Redis 的分布式二级缓存

Jboot v3.6.9  更新内容如下:

  • 新增:AttachmentManager 新增保存文件的若干方法
    新增:Controller 参数新增 @JsonBody 的支持
    新增:Http 工具模块添加更多的配置,方便在 fatjar 模式下能配置 https 相关证书
    新增:ErrorRender 自动判断前端是否需要 json 渲染,当请求头是 application/json 的时候自动渲染错误的 json
    优化:JbootSimpleApplication,使之代码更加简洁
    优化:优化缓存拦截器对方法的 key 进行构建,提高性能
    优化:默认为 JbootAccessTokenCache 添加 2 个小时的缓存时间
    优化:LocalAttachmentContainer,默认保存文件的时候,对文件进行相同文件验证
    优化:JwtManager 对 Jwt 解析出错或没有 Jwt 数据时,返回常量 map
    优化:升级 JFinal、Undertow、Jackson 等到最新版本


开发文档:

https://jbootprojects.gitee.io/docs/

同时,Jboot 官方也推出了企业级开发框架 JbootAdmin,详情 https://jbootprojects.gitee.io/docs/jbootadmin/

maven 依赖:

<dependency>
    <groupId>io.jboot</groupId>
    <artifactId>jboot</artifactId>
    <version>3.6.9</version>
</dependency>

Hello World:

@RequestMapping("/")
public class HelloworldController extends JbootController { 
   
    public void index(){
        renderText("hello world");
    }    
    
    public static void main(String[] args){
        JbootApplication.run(args);
    }
}


评论区

山东小木

2020-12-10 12:15

666!!

JFinal

2020-12-10 12:23

jfinal 升到了 4.9.05, jfinal undertow 升到了 2.3 , 这个超爽的 ^_^

司徒阿仔

2020-12-10 13:11

上个礼拜开始使用jboot,然后也同样造了一个@JsonBody的轮子,哈,这回来正统的了,准备切换过去。

xialinlin

2020-12-10 15:39

@JFinal 可以考虑加这个jsonbody进去

弯道加速跑

2020-12-11 08:22

wow wow~~~

司徒阿仔

2020-12-11 09:21

海哥,可否加如基本类型的参数注入,例如:
fetchListByPage(@JsonBody("pageNo") Integer pageNo, @JsonBody("pageSize") Integer pageSize)

海哥

2020-12-11 11:20

@司徒阿仔 这个是支持的呀,没问题的,比如前段传入
{
"pageNo":1,
"pageSize":2
}
这样,你通过 fetchListByPage(@JsonBody("pageNo") Integer pageNo, @JsonBody("pageSize") Integer pageSize) 是可以正常获取值得。

司徒阿仔

2020-12-11 11:48

@海哥 海哥,刚才断点跟踪了一下,JsonBodyParseInterceptor.java的第90行,会抛出java.lang.Integer cannot be cast to com.alibaba.fastjson.JSONObject。
传入的json:{"pageNo":1,"pageSize":20,"roleName":null,"roleCode":null}
异常信息:{"code":"1","data":null,"message":"Can not parse json to type: class java.lang.Integer in method: com.xxx.rest.role.RoleController.fetchListByPage(java.lang.Integer,java.lang.Integer)","state":"fail"};

海哥

2020-12-11 12:30

@司徒阿仔 你的代码是什么样的呢?

司徒阿仔

2020-12-11 12:44

@海哥 Controller的代码如下,
@Path("/sysRole")
public class RoleController extends JbootController {
@Inject
private SysRoleService sysRoleService;

public void fetchListByPage(@JsonBody("pageNo") Integer pageNo, @JsonBody("pageSize") Integer pageSize) {
renderJson();
}
}

海哥

2020-12-11 14:14

@司徒阿仔 已经确定问题,下个版本发布吧,已经提交代码了

司徒阿仔

2020-12-11 14:57

prelove

2020-12-11 17:13

支持同时对参数validate不?打个注解@NotNull之类的?

海哥

2020-12-11 17:15

@prelove 暂时不支持,可以通过自己的 ValidateUtil 工具类去验证下 Model 或者 Bean

海哥

2020-12-11 17:15

@司徒阿仔 新的修复版本 3.7.0 已经发布。

司徒阿仔

2020-12-11 20:43

@海哥 OK,已更新,现在正常了。

北流家园网

2020-12-12 22:59

@JFinal 4.5什么时候发布?