目录
一、ajax传输数据不是json类型,导致数据不能被后台实体类接收。
三、静态资源无法访问,访问时报404错误。导致背景图无法正常加载。
一、java.lang.IllegalArgumentException
二、A component required a bean of type 'Spring_Test.UserMapper' that could not be found.
七、使用@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格式,导致后台接收数据时不能够传输给实体类进行初始化。错误的数据格式如下图所示。
解决措施:将ajax的数据部分使用下面方法转为json格式。
data: JSON.stringify({ 名1:值1,名2:值2}),
下面时ajax修改后的写法,可以正常向后台发送json数据,并能被实体类接收。
这个坑解决办法的原帖:(9条消息) 关于使用ajax的post方法出现data数据不是json的情况_因你而在的梦的博客-优快云博客
二、如何通过实体类接收前端传来的json数据
问题:从前端传来的content数据是一个字符串类型的json数据,这样不好进行后续处理。
collor层代码:
从前端接收的数据:
解决措施:采用实体类对接收的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类型。
解决措施:把新对象的创建放在循环里面,才能避免tiezi类型的值被循环覆盖
原帖出处:(26条消息) List的add()覆盖了前面的所有元素问题解决_我可能在扯淡的博客-优快云博客
三、静态资源无法访问,访问时报404错误。导致背景图无法正常加载。
问题:下图为浏览器控制台输出的错误。背景图无法被找到。
解决措施:配置静态资源映射。
1、controller类实现WebMvcConfigurer接口:
WebMvcConfigurer详解帖子:(28条消息) SpringBoot---WebMvcConfigurer详解_zhangpower1993的博客-优快云博客_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页面。如下图所示:
解决措施:需要用到视图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中以注解的形式查询了一次。如下图
解决措施:删掉其中一个。
二、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.
报错如下图:
报错原因:dao接口类没有在Spring Boot主程序可以扫描的包或者子包下面,需要MapperScan注解手动配置扫描包。
解决措施:在Contronller类上面添加MapperScan注解并且手动配置要扫描的包
@MapperScan(basePackages = {"Spring_Test"})
三、org.apache.avro.AvroRuntimeException: Unknown datum class: class org.springframework.validation.BeanPropertyBindingResult
报错详情:
报错原因:没有为需要返回给前端的对象parameter添加@RequestParam
@ResponseBody
@RequestMapping(value = "/publish")
public String publish(@RequestBody content content, @RequestParam(value ="user") String user, Map<String, String> 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注解
六、IOC(控制反转)的理解(转载)
IoC(Inverse of Control:控制反转) 是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。不过, IoC 并非 Spring 特有,在其他语言中也有应用。
为什么叫控制反转?
- 控制 :指的是对象创建(实例化、管理)的权力
- 反转 :控制权交给外部环境(Spring 框架、IoC 容器)
将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。 IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。
在实际项目中一个 Service 类可能依赖了很多其他的类,假如我们需要实例化这个 Service,你可能要每次都要搞清这个 Service 所有底层类的构造函数,这可能会把人逼疯。如果利用 IoC 的话,你只需要配置好,然后在需要的地方引用就行了,这大大增加了项目的可维护性且降低了开发难度。
在 Spring 中, IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个 Map(key,value),Map 中存放的是各种对象。
Spring 时代我们一般通过 XML 文件来配置 Bean,后来开发人员觉得 XML 文件来配置不太好,于是 SpringBoot 注解配置就慢慢开始流行起来。
相关阅读:
七、使用@Data注解后用实体类接收前端传来的json时字段为null值
原因:
- 由于实体类的参数命名不规范导致的,因字段名驼峰命名无法匹配字段名导致。spring框架在接收参数的时候的get()方法无法识别参数。
- @Data注解生成的get/set方法和idea工具自动生成的get/set命名上竟然会不一致。
解决措施:
- 1、加@JsonProperty注解,通过设置value属性将实体类字段和前端数据绑定(我用的这个)。
- 2、手动在实体类增加set/get方法。
总结: 以后写实体类在加@Data注解时要多留个心眼,最好在实体类中写get/set方法,而不是通过@Data隐藏封装get/set方法。另外如果涉及前端的json的化,最好一定要加@JsonProperty。来保证实体类中的字段与json一一对应上。
原帖:(54条消息) Spring中使用@RequestBody注解接收的实体类中的某些参数为null_金斗潼关的博客-优快云博客
八、胡乱使用@RefreshScope注解导致Bean注入失败报Null空值错误
报错详情:
原因:
- 我在Controller层的类头部加上了@RefreshScope注解导致Bean的的作用域被刷新了造成调用mybaties的Service服务时报空指针异常
- 这里forumService并没有被成功注入导致使用时报空指针异常
解决措施:
- 把@RefreshScope注解删除掉即可解决,不懂的情况下不要乱用。