Spring boot学习笔记

目录

 一、ajax传输数据不是json类型,导致数据不能被后台实体类接收。

二、如何通过实体类接收前端传来的json数据  

三、List的add()覆盖了前面的所有元素   

三、静态资源无法访问,访问时报404错误。导致背景图无法正常加载。

四、使用@RestController注解返回html页面

五、故障排除

一、java.lang.IllegalArgumentException

二、A component required a bean of type 'Spring_Test.UserMapper' that could not be found.

三、org.apache.avro.AvroRuntimeException: Unknown datum class: class org.springframework.validation.BeanPropertyBindingResult

六、IOC(控制反转)的理解(转载)

七、使用@Data注解后用实体类接收前端传来的json时字段为null值 

 八、胡乱使用@RefreshScope注解导致Bean注入失败报Null空值错误


 一、ajax传输数据不是json类型,导致数据不能被后台实体类接收。

ajax发送源码

$.ajax({
            type: 'POST',
            dataType: 'json',
            contentType: 'application/json;charset=UTF-8',
            data: {
                "user_name": dm.value,  // 支付项目编号
                "passwd": mm.value,    // 支付方式
            },
            url: '/zhuce',
            success: function (data) {
                alert('注册成功');
            },
            error: function(data) {
      alert('发送失败');
   }
})

问题: 在向后台发送数据时候发现发送的数据不是json格式,导致后台接收数据时不能够传输给实体类进行初始化。错误的数据格式如下图所示。

Spring boot学习笔记_第1张图片

解决措施:将ajax的数据部分使用下面方法转为json格式。

data: JSON.stringify({ 名1:值1,名2:值2}),

下面时ajax修改后的写法,可以正常向后台发送json数据,并能被实体类接收。

Spring boot学习笔记_第2张图片

 这个坑解决办法的原帖:(9条消息) 关于使用ajax的post方法出现data数据不是json的情况_因你而在的梦的博客-CSDN博客

二、如何通过实体类接收前端传来的json数据  

 问题:从前端传来的content数据是一个字符串类型的json数据,这样不好进行后续处理。

collor层代码: 

Spring boot学习笔记_第3张图片

 从前端接收的数据:

解决措施:采用实体类对接收的json数据进行封装,实体类会自动将json数据进行解析。

自定义的content类,包含有set和get方法:

package Spring_Test;
public class content {
    private String content;

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

这里使用content类封装,并调用get方法获取内容

@RequestMapping(value = "/publish", method = RequestMethod.POST)
    @ResponseBody
    public void publish(@RequestBody content content,@RequestParam(value ="user") String user) throws Exception{
        System.out.println("前端传来的内容为:"+content.getContent());
        System.out.println(user);
//        sql_save.tiezi_save(user,content.getContent());
    }

 控制台输出:

 总结:当前端传来的json数据不好处理时,可以自定义一个实体类用于接收json数据。springboot会自动将json的各个键值赋值给实体类的字段,但是要注意---json数据的各个键必须要和字段名相对应,否则实体类无法解析json数据。

三、List的add()覆盖了前面的所有元素   

问题:当tiezi类型的定义在循环之外时,会导致 tiezi类型被循环覆盖,这样linklist就只存储了最后一个定义的tiezi类型。

Spring boot学习笔记_第4张图片 解决措施:把新对象的创建放在循环里面,才能避免tiezi类型的值被循环覆盖

Spring boot学习笔记_第5张图片

 原帖出处:(26条消息) List的add()覆盖了前面的所有元素问题解决_我可能在扯淡的博客-CSDN博客

三、静态资源无法访问,访问时报404错误。导致背景图无法正常加载。

问题:下图为浏览器控制台输出的错误。背景图无法被找到。 

Spring boot学习笔记_第6张图片

 解决措施:配置静态资源映射。

1、controller类实现WebMvcConfigurer接口:

WebMvcConfigurer详解帖子:(28条消息) SpringBoot---WebMvcConfigurer详解_zhangpower1993的博客-CSDN博客_webmvcconfigurer

2、重写addResourceHandlers方法,配置静态资源映射。

    /**
     * 配置静态资源的映射 没有这个会导致静态资源404,导致没有背景
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {  //配置静态资源的映射
        registry.addResourceHandler("/static/**").addResourceLocations("file:C:\\Users\\DELL\\OneDrive\\IDEA\\test1\\src\\main\\resources\\static\\");
    }

四、使用@RestController注解返回html页面

问题: @RestController 注解包含了原来的 @Controller 和 @ResponseBody 注解。所以返回的是一个json格式的数据,而无法返回html页面。如下图所示:

Spring boot学习笔记_第7张图片

解决措施:需要用到视图ModelAndView,使用视图读取hello.html页面,并进行返回。

@RequestMapping(value = "/hello" )
    public ModelAndView hello() {
        ModelAndView mv = new ModelAndView("hello");
        return mv;

    }

五、故障排除

一、java.lang.IllegalArgumentException

错误详细信息:Caused by: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for Spring_Test.UserMapper.getUserByName

报错如下图:

 报错原因:在xml中存在id冲突

 也就是我在xml中配置了sql语句 同时又在java中以注解的形式查询了一次。如下图

Spring boot学习笔记_第8张图片

Spring boot学习笔记_第9张图片

解决措施:删掉其中一个。

二、A component required a bean of type 'Spring_Test.UserMapper' that could not be found.

报错详情:

***************************
APPLICATION FAILED TO START
***************************

Description:

A component required a bean of type 'Spring_Test.UserMapper' that could not be found.


Action:

Consider defining a bean of type 'Spring_Test.UserMapper' in your configuration.

报错如下图:
Spring boot学习笔记_第10张图片

报错原因:dao接口类没有在Spring Boot主程序可以扫描的包或者子包下面,需要MapperScan注解手动配置扫描包。

解决措施:在Contronller类上面添加MapperScan注解并且手动配置要扫描的包

@MapperScan(basePackages = {"Spring_Test"})

Spring boot学习笔记_第11张图片

三、org.apache.avro.AvroRuntimeException: Unknown datum class: class org.springframework.validation.BeanPropertyBindingResult

报错详情:

Spring boot学习笔记_第12张图片

 报错原因:没有为需要返回给前端的对象parameter添加@RequestParam

 @ResponseBody
    @RequestMapping(value = "/publish")
    public String publish(@RequestBody content content, @RequestParam(value ="user") String user, Map parameter){
        System.out.println("前端传来的内容为:"+content.getContent());
        System.out.println(user);
//        userService.Save_tiezi(user,content.getContent());
        parameter.put("msg", "ok");
        return Json.toString(parameter);
    }

解决措施:添加@RequestParam注解

Spring boot学习笔记_第13张图片

六、IOC(控制反转)的理解(转载)

IoC(Inverse of Control:控制反转) 是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。不过, IoC 并非 Spring 特有,在其他语言中也有应用。

为什么叫控制反转?

  • 控制 :指的是对象创建(实例化、管理)的权力
  • 反转 :控制权交给外部环境(Spring 框架、IoC 容器)

Spring boot学习笔记_第14张图片

将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。 IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。

在实际项目中一个 Service 类可能依赖了很多其他的类,假如我们需要实例化这个 Service,你可能要每次都要搞清这个 Service 所有底层类的构造函数,这可能会把人逼疯。如果利用 IoC 的话,你只需要配置好,然后在需要的地方引用就行了,这大大增加了项目的可维护性且降低了开发难度。

在 Spring 中, IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个 Map(key,value),Map 中存放的是各种对象。

Spring 时代我们一般通过 XML 文件来配置 Bean,后来开发人员觉得 XML 文件来配置不太好,于是 SpringBoot 注解配置就慢慢开始流行起来。

相关阅读:

  • IoC 源码阅读
  • 面试被问了几百遍的 IoC 和 AOP ,还在傻傻搞不清楚?

转载自:JavaGuide/spring-knowledge-and-questions-summary.md at main · Snailclimb/JavaGuide (github.com)https://github.com/Snailclimb/JavaGuide/blob/main/docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md

七、使用@Data注解后用实体类接收前端传来的json时字段为null值 

原因:

  • 由于实体类的参数命名不规范导致的,因字段名驼峰命名无法匹配字段名导致。spring框架在接收参数的时候的get()方法无法识别参数。
  • @Data注解生成的get/set方法和idea工具自动生成的get/set命名上竟然会不一致。

 解决措施:

  • 1、加@JsonProperty注解,通过设置value属性将实体类字段和前端数据绑定(我用的这个)。Spring boot学习笔记_第15张图片

  • 2、手动在实体类增加set/get方法。

总结: 以后写实体类在加@Data注解时要多留个心眼,最好在实体类中写get/set方法,而不是通过@Data隐藏封装get/set方法。另外如果涉及前端的json的化,最好一定要加@JsonProperty。来保证实体类中的字段与json一一对应上。

原帖:(54条消息) Spring中使用@RequestBody注解接收的实体类中的某些参数为null_金斗潼关的博客-CSDN博客

 八、胡乱使用@RefreshScope注解导致Bean注入失败报Null空值错误

报错详情:

原因:

  • 我在Controller层的类头部加上了@RefreshScope注解导致Bean的的作用域被刷新了造成调用mybaties的Service服务时报空指针异常

Spring boot学习笔记_第16张图片

  •  这里forumService并没有被成功注入导致使用时报空指针异常

Spring boot学习笔记_第17张图片

  解决措施:

  • 把@RefreshScope注解删除掉即可解决,不懂的情况下不要乱用。

你可能感兴趣的:(spring,boot,spring)