jfinal关联查询的model如何在springboot中优雅返回

我们知道jfinal关联查询的结果是无法通过fastjson完整转化为json串的,因为一些关联属性并没有get set方法。

它原声不支持,我们就要创造条件让他支持

思路:重写fastjson的类,增加处理activerecord的逻辑

框架 : springboot + jfinal dao

1.重写fastjson的方法

package com.sj.configuration.json;

import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;

import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotWritableException;

import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import com.jfinal.kit.JsonKit;
import com.jfinal.plugin.activerecord.Model;

public class JFastJsonHttpMessageConverter extends FastJsonHttpMessageConverter{
    public static final Charset UTF8 = Charset.forName("UTF-8");

	@Override
	protected void writeInternal(Object object, HttpOutputMessage outputMessage)
			throws IOException, HttpMessageNotWritableException {
		if(object instanceof Model) {
			OutputStream out = outputMessage.getBody();
			out.write(JsonKit.toJson(object).getBytes(UTF8));
		}else {
			super.writeInternal(object, outputMessage);
		}
	}
	
}


主要是这一段

if(object instanceof Model) {}


2.注册json处理器

package com.sj.configuration.app;

import java.util.ArrayList;
import java.util.List;

import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.sj.configuration.json.JFastJsonHttpMessageConverter;

@Configuration
public class AppConfiguration {
	@Bean
	public HttpMessageConverters fastJsonHttpMessageConventers() {
		JFastJsonHttpMessageConverter converter = new JFastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        List<MediaType> mediaTypes = new ArrayList<MediaType>();
        mediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        config.setSerializerFeatures(SerializerFeature.PrettyFormat);
        converter.setSupportedMediaTypes(mediaTypes);
        converter.setFastJsonConfig(config);
        HttpMessageConverter<?> converter1 = converter;
        return new HttpMessageConverters(converter1);
	}
}

这里面就用到了我们自己写的

JFastJsonHttpMessageConverter

我们看一下效果

image.png

package com.sj.contorller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.sj.model.SysUser;

@RestController
public class TestController {
	@RequestMapping("/user")
	public SysUser user() {
		SysUser user = new SysUser();
		user.setUsername("name");
		user.setUserid("id");
		user.put("xx", "abc");
		return user;
	}
}

大家看到 xx也被打印出来了

大功告成

评论区

快乐的蹦豆子

2019-01-25 14:34

代码在这里 https://gitee.com/git_zhanglong/sj
里面还附赠一个basedao可供使用

HingLo

2019-01-25 15:40

非常好!过去我都是写了Model转为Map的,这种方式非常棒

caoxusheng

2019-01-25 20:46

我试了下,两表联查,在一个model中,sql实际出来的有四个字段,转换之后就两个字段了,好像还是不行

快乐的蹦豆子

2019-01-26 16:10

@caoxusheng 你肯定是某些地方有问题,我这例子都有结果也有,对比下找出你的问题

caoxusheng

2019-01-26 19:13

@快乐的蹦豆子 不知道是不是bug,我在jfinal里面试了下 也少字段 select * from t_test a left join t_test2 b on a.id=b.id 精确到字段 可以,但是用 *就会有问题,但数据库查出来是有的

zhangtianxiao

2019-01-30 22:31

最佳姿势是创建配置类继承com.alibaba.fastjson.serializer.ObjectSerializer, 在FastJson全局配置中注册Record

快乐的蹦豆子

2019-01-31 09:37

@zhangtianxiao 一个样,有什么区别

zhangtianxiao

2019-01-31 09:54

@快乐的蹦豆子 最简单直接的方式, 不需要耦一层spring的HttpMessageConverter

快乐的蹦豆子

2019-01-31 10:21

@zhangtianxiao 不错不错,有示例代码可以贴一下,补充一下

JM-java

2019-02-11 11:54

我感觉没这么麻烦吧.我只用了一个方法就处理好了.所有返回方法我都是用的这个,能够返回json串
protected void returnJson(Object pojo){
renderJson(JFinalJson.getJson().toJson(pojo));
}

快乐的蹦豆子

2019-02-11 14:07

@JM-java 注意优雅二字

JM-java

2019-02-11 14:41

好吧 . 确实比我这个有逼格 哈哈