• Controller 返回 json那些小事


    快速解决

    想要将对象转换为json我们需要先在maven中导入一些包。

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.9.0</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.0</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.9.0</version>
    </dependency>
    

    修改spring-mvc配置文件增加 【第二行】 和 【倒数一二行】

    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
             http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/mvc 
            http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    

    在spring-mvc配置文件中添加

    <mvc:annotation-driven/>
    

    使用直接返回对象即可

    @RequestMapping(value = "/quick2")
    @ResponseBody
    public User save2() throws JsonProcessingException {
        User user = new User();
        user.setName("探索星空");
        user.setAge(12);
        return user;
    }
    

    下面是我的学习过程

    想要将对象转换为json我们需要先在maven中导入一些包。

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.9.0</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.0</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.9.0</version>
    </dependency>
    

    我们测试一下

    @RequestMapping(value = "/quick3")
    @ResponseBody
    public String save3() throws JsonProcessingException {
        User user = new User();
        user.setName("探索星空");
        user.setAge(12);
    
        ObjectMapper o = new ObjectMapper();
        String s = o.writeValueAsString(user);
    
        return String;
    }
    

    运行结果出现了http 500错误

    我又在纯Java中测试了一下

    class Solution {
        public static void main(String[] args) throws JsonProcessingException {
            User user = new User();
            user.setName("探索星空");
            user.setAge(12);
    
            ObjectMapper o = new ObjectMapper();
            String s = o.writeValueAsString(user);
            System.out.println(s);
        }
    }
    
    output: {"name":"探索星空","age":12}
    

    一切正常,我又仔细看了下之前报错的信息......

    Handler dispatch failed(处理程序调度失败);一般出现这个提示,就是说明有包没有导入。

    看了下WEB-INF/lib下的包果然没有。

    image-20211007004826317

    果断点击file->project structure->artifacts 。put需要的包

    image-20211007005106598

    再次运行又发现一个新的问题-字符乱码:image-20211007005551148

    还好这个问题比较简单,我们在spring-mvc的配置文件中加入

    <!-- 用于使用@ResponseBody后返回中文避免乱码 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean id="stringHttpMessageConverter"
                      class="org.springframework.http.converter.StringHttpMessageConverter">
                    <property name="writeAcceptCharset" value="false" />
                    <property name="supportedMediaTypes">
                        <list>
                            <value>text/html;charset=UTF-8</value>
                        </list>
                    </property>
                </bean>
            </list>
        </property>
    </bean>
    

    问题顺利解决:image-20211007005933242

    优化配置

    每次都要这样恐怕太麻烦了

    ObjectMapper o = new ObjectMapper();
    String s = o.writeValueAsString(user);
    

    我们可以在spring-mvc的配置文件中加入

    <!--    处理json-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
            </list>
        </property>
    </bean>
    

    这样处理后,只要在Controller中返回需要转化的对象会可以了

    @RequestMapping(value = "/quick2")
    @ResponseBody
    public User save2() throws JsonProcessingException {
        User user = new User();
        user.setName("探索星空");
        user.setAge(12);
        return user;
    }
    

    结果:image-20211007011143693

    值得一提的是,这种方法配置的程序会自动加入utf-8头字段声明,我们删去之前处理乱码的代码

    结果:image-20211007010835488

    大功告成。

    更新方法【在文章开头】

  • 相关阅读:
    Maven打包时去掉项目版本号
    maven编译的时候排除junit测试类
    Redis与Zookeeper实现分布式锁的区别
    分布式锁(基于redis和zookeeper)详解
    解读阿里巴巴集团的“大中台、小前台”组织战略
    java高并发系列
    JAVA之Unsafe学习笔记
    测试用例之正交排列法
    测试用例之因果图/判定表
    测试用例之边界值法
  • 原文地址:https://www.cnblogs.com/adamr/p/15374833.html
Copyright © 2020-2023  润新知