目录
一、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发送源码
$.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的情况_因你而在的梦的博客-CSDN博客
问题:从前端传来的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数据。
问题:当tiezi类型的定义在循环之外时,会导致 tiezi类型被循环覆盖,这样linklist就只存储了最后一个定义的tiezi类型。
解决措施:把新对象的创建放在循环里面,才能避免tiezi类型的值被循环覆盖
原帖出处:(26条消息) List的add()覆盖了前面的所有元素问题解决_我可能在扯淡的博客-CSDN博客
问题:下图为浏览器控制台输出的错误。背景图无法被找到。
解决措施:配置静态资源映射。
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
注解包含了原来的 @Controller
和 @ResponseBody
注解。所以返回的是一个json格式的数据,而无法返回html页面。如下图所示:
解决措施:需要用到视图ModelAndView,使用视图读取hello.html页面,并进行返回。
@RequestMapping(value = "/hello" )
public ModelAndView hello() {
ModelAndView mv = new ModelAndView("hello");
return mv;
}
错误详细信息:Caused by: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for Spring_Test.UserMapper.getUserByName
报错如下图:
报错原因:在xml中存在id冲突
也就是我在xml中配置了sql语句 同时又在java中以注解的形式查询了一次。如下图
解决措施:删掉其中一个。
报错详情:
***************************
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"})
报错详情:
报错原因:没有为需要返回给前端的对象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注解
IoC(Inverse of Control:控制反转) 是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。不过, IoC 并非 Spring 特有,在其他语言中也有应用。
为什么叫控制反转?
将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。 IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。
在实际项目中一个 Service 类可能依赖了很多其他的类,假如我们需要实例化这个 Service,你可能要每次都要搞清这个 Service 所有底层类的构造函数,这可能会把人逼疯。如果利用 IoC 的话,你只需要配置好,然后在需要的地方引用就行了,这大大增加了项目的可维护性且降低了开发难度。
在 Spring 中, IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个 Map(key,value),Map 中存放的是各种对象。
Spring 时代我们一般通过 XML 文件来配置 Bean,后来开发人员觉得 XML 文件来配置不太好,于是 SpringBoot 注解配置就慢慢开始流行起来。
相关阅读:
转载自: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注解时要多留个心眼,最好在实体类中写get/set方法,而不是通过@Data隐藏封装get/set方法。另外如果涉及前端的json的化,最好一定要加@JsonProperty。来保证实体类中的字段与json一一对应上。
原帖:(54条消息) Spring中使用@RequestBody注解接收的实体类中的某些参数为null_金斗潼关的博客-CSDN博客
报错详情:
原因:
解决措施: