无名阁,只为技术而生。流水不争先,争的是滔滔不绝。

自定义springmvc json视图解析处理 过程介绍1(图文详解)

Java Micheal 1年前 (2023-11-28) 236次浏览 已收录 0个评论 扫描二维码
自定义springmvc json视图解析处理 过程介绍1(图文详解)

json视图

自定义springmvc json视图解析处理 完整攻略:

在使用Spring MVC进行web开发时,返回json视图是非常常见的操作。默认的情况下,Spring MVC使用Jackson库将对象转换为json格式的数据,并返回给前端。但是,在一些特殊的应用场景中,我们需要使用自定义的json视图。比如,我们需要将实体类中的某些属性剔除掉,或者需要对某些属性进行格式化,此时就需要自定义json视图。

实现自定义json视图的思路就是:

  1. 创建一个自定义的json视图类,继承AbstractView类,并重写里面的renderMergedOutputModel方法,将model中的数据转换成json格式的数据,并写入HttpServletResponse对象中。
  2. 在controller中,将方法的返回值设置为我们自定义的json视图类的实例。
  3. 在方法中设置需要返回给前端的数据。

二、具体实现步骤

接下来我将分别说明自定义json视图的具体实现步骤。

1. 创建自定义视图类

创建一个实现了AbstractView类的自定义视图类,代码示例如下:

public class CustomJsonView extends AbstractView {

    public static final String CONTENT_TYPE = "application/json";

    private ObjectMapper objectMapper;

    public CustomJsonView() {
        super.setContentType(CONTENT_TYPE);
        objectMapper = new ObjectMapper();
    }

    @Override
    protected void renderMergedOutputModel(Map<String, Object> model,
            HttpServletRequest request, HttpServletResponse response) throws Exception {

        response.setContentType(CONTENT_TYPE);
        response.setCharacterEncoding("UTF-8");
        OutputStream outputStream = response.getOutputStream();
        objectMapper.writeValue(outputStream, model);
        outputStream.flush();
    }
}

说明:

  • 自定义视图类必须继承AbstractView类。
  • 在构造方法中设置Content-Type为application/json,这样可以使浏览器知道返回的是json格式的数据。
  • 在renderMergedOutputModel方法中,先设置响应的Content-Type和字符编码,然后通过ObjectMapper将model中的数据转换成json格式的数据,并写入到HttpServletResponse对象的输出流中。

2. 定义Controller

在Controller中定义一个方法,返回我们自定义的json视图类的实例。这里使用了@GetMapping注解,表示该方法只接收GET请求。

@RestController
public class PersonController {

    @GetMapping("/person/{id}")
    public ModelAndView getPersonById(@PathVariable("id") int id) {
        Person person = new Person(id, "张三", "zhangsan@example.com");
        Map<String, Object> model = new HashMap<>();
        model.put("person", person);
        return new ModelAndView(new CustomJsonView(), model);
    }
}

说明:

  • Controller需要添加@RestController注解,表示该类是一个Spring MVC的Controller,并且返回的数据将以json格式返回。
  • 在getPersonById方法中,构造一个Person对象,并将其作为model参数传入到CustomJsonView的实例中。

3. 测试

现在可以启动应用程序,并访问http://localhost:8080/person/1,可以看到返回的结果是json格式的数据,如下所示:

{
  "person": {
    "id": 1,
    "name": "张三",
    "email": "zhangsan@example.com"
  }
}

这就是我们自定义的json视图。

三、更多示例

除了上面的示例,我们还可以根据实际业务需求进行自定义json视图。下面介绍两个自定义json视图的示例。

示例一:剔除实体类中的某些属性

如果我们需要剔除实体类中的某些属性,可以写一个自定义视图类,继承JacksonJsonView类(它已经处理了json格式的对象转换),并重写里面的writeContent方法,通过反射的方式修改对象中的属性,然后再调用父类的writeContent方法,将修改后的对象转成json格式的数据。

代码示例如下:

public class CustomJacksonJsonView extends MappingJackson2JsonView {

    @Override
    protected void writeContent(Object object, HttpServletResponse response) throws IOException {
        if (object instanceof Map) {
            Map map = (Map) object;
            // 剔除password属性
            map.remove("password");
        } else if (object instanceof User) {
            User user = (User) object;

            // 剔除password属性
            user.setPassword(null);
        }

        super.writeContent(object, response);
    }
}

示例二:对实体类中的某些属性进行格式化

如果我们需要对实体类中的某些属性进行格式化,比如从Date类型格式化成指定格式的字符串,可以写一个自定义的ObjectMapper,然后在自定义视图类中设置这个ObjectMapper即可。

代码示例如下:

public class CustomObjectMapper extends ObjectMapper {

    public CustomObjectMapper() {
        super();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        super.setDateFormat(sdf);
    }
}
public class CustomJsonView extends AbstractView {

    public static final String CONTENT_TYPE = "application/json";

    private ObjectMapper objectMapper;

    public CustomJsonView() {
        super.setContentType(CONTENT_TYPE);
        objectMapper = new CustomObjectMapper();
    }

    @Override
    protected void renderMergedOutputModel(Map<String, Object> model,
            HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 省略和上面相同的代码

        objectMapper.writeValue(outputStream, model);
        outputStream.flush();
    }
}

四、总结

通过本文的介绍,我们可以知道自定义视图的实现思路,以及两个自定义视图的示例:剔除实体类中的某些属性和对实体类中的某些属性进行格式化。了解了自定义视图的实现思路和使用场景,可以让我们更好地掌握Spring MVC框架的使用,并满足项目需求的实现。

ubuntu apt换源 apt-get换源国内source 方法大全1(图文)

喜欢 (0)
[]
分享 (0)
关于作者:
流水不争先,争的是滔滔不绝
发表我的评论
取消评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

表情 贴图 加粗 删除线 居中 斜体 签到