SpringBoot中springMVC返回JSON报错-->Could not write JSON: No serializer found for class org.spring...

用springboot简单写一个返回Model的小例子,因为控制器上注解为@RestController,自动应该返回json格式,报错:

>Could not write JSON: No serializer found for class org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS); nested exception is com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.cc.springbootDemo.schema.Project$$EnhancerBySpringCGLIB$$491fb76d["CGLIB$CALLBACK_0"])

代码如下:

bean:

@Configuration
@JsonAutoDetect(fieldVisibility = Visibility.ANY)
public class Project implements java.io.Serializable{

    private static final long serialVersionUID = 1L;

    /*
     * @Value注解加载属性值的时候可以支持两种表达式来进行配置
     * 1.PlaceHolder方式,格式为${...},大括号内为PlaceHolder
     * 2.SpEl表达式,格式为#{...},大括号内为SpEL表达式
     */
    @Value("${project.name}")
    private String name;

    @Value("${project.author}")
    private String author;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }
}

Controller:

@RestController
@RequestMapping("/project")
public class ProjectController {
    //==============以下是依赖注入的简单示例=======================================
    @Autowired
    private ProjectService projectService;

    @RequestMapping("/handleBean")
    public String handleBean() {
        return projectService.findOneProject().getAuthor();
    }

    @RequestMapping("/handleBean2")
    public Project handleBean2() {
        Project pro1 = projectService.findOneProject();
        return pro1;
    }

    public ProjectService getProjectService() {
        return projectService;
    }

    public void setProjectService(ProjectService projectService) {
        this.projectService = projectService;
    }
}

最后发现通过原来是因为这个对象是通过代理产生的类,所以才报错:
这里写图片描述

划红线的部分都是bean没有的属性,在jackson2转化为json的时候发现,没有这个属性,所以不能产生成对应的json返回,如果这样写:

@RequestMapping("/handleBean2")
    public Project handleBean2() {


        Project pro1 = projectService.findOneProject();
        //规避代理类不能转化为json的错误
        Project pro = new Project();
        pro.setAuthor(pro1.getAuthor());
        pro.setName(pro1.getName());
        return pro;
    }

访问此请求http://localhost:8080/project/handleBean2(自己小例子,点击无用)显示:
这里写图片描述

多说一些:
1.在IE浏览器上你会发现它默认是文件格式,提示让你下载:
这里写图片描述
我们需要加上拦截让他显示成text/html格式,xml需要这样配置:

<mvc:annotation-driven validator="validator">
        <mvc:message-converters>
            <!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
            <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                         <value>text/html;charset=UTF-8</value>
                    </list>
                </property>
             </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

2.每一个对象都要从代理类转化为实体类,很是麻烦,但是发现如果不当做配置类注入@Value的话,它是没有这个错误的:
bean:

@Component//把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>)
public class Student implements java.io.Serializable{
    private static final long serialVersionUID = 1L;
    //名称
    private String name;
    //性别
    private Integer sex;
    //电话
    private String telephone;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getSex() {
        return sex;
    }
    public void setSex(Integer sex) {
        this.sex = sex;
    }
    public String getTelephone() {
        return telephone;
    }
    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }
}

Controller:

@RequestMapping("/handleBean3")
public Student handleBean3() {
    return projectService.findOneStudent();
}

访问http://localhost:8080/project/handleBean3后,显示:
{“name”:”cc”,”sex”:1,”telephone”:”18800000000”}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值