1.在使用spring管理bean时重要的一点是提供getset方法还有无参构造函数。
最近在使用springmvc中的@requestBody时没有注意到这一点,导致参数一直获取不到,也不报错,最后花了一段时间才发现是没有无参构造函数。
顺便记录下@requestBody,可以接收application/json的请求,将其中的参数传入对应的一个对象。而对于表单提交的数据或者content-Type为application/x-www-form-urlencoded的请求则直接放置一个对应的对象就可以接收参数,不需要任何注解。
先记录到这,以后还有问题继续记录。
2.在写restful风格api时,写了一个如下的api,
@RequestMapping("/user")
@Controller
public class UserController {
@RequestMapping(value = "/register", method = RequestMethod.POST)
public void register(@RequestBody User user) {
System.out.println(user);
}
}
接受前台user对象一切正常,只是在拦截器中发现除了/user/register这个请求url外还多出了一个/user/user/register这个莫名奇妙的url.
修了半天还是没找到原因,最后阴差阳错发现配置返回值之后就正常了,如下
@RequestMapping("/user")
@Controller
public class UserController {
@ResponseBody
@RequestMapping(value = "/register", method = RequestMethod.POST)
public Response register(@RequestBody User user) {
System.out.println(user);
return new Response(1, "ss");
}
}
3.使用springmvc和Spring时把两者的配置文件分开写了,
springmvc处理mapping之类的,spring处理bean之类。
结果问题就来了,在controller里面注解注入service,启动一直报找不到service实例。
事实上写一个测试可以发现service是可以被实例化的,只是没有被注入。
然后全部在xml中配置bean,结果还是一样的。
感觉问题出在<context:component-scan>,因为两个文件都配置了base-package.但是我其实处理过了这个,
spring中
<context:component-scan base-package="com.ljf">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>
springmvc中
<context:component-scan base-package="com.ljf" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>
这样不行。我又修改了n种情况,结果依旧各种错误。即使两遍都配置为扫描所有包所有注解。依旧是缺少各种bean。
事实上写个测试类那些bean都存在。感觉springmvc和spring在那些方面冲突了导致的。找了一天发现也有人遇到这问题,然而说的很模糊。
最终还是在springmvc中配置了所有的,不再分离出spring单独的配置文件,这样一点错也没有,也间接说明两者之间存在着某些冲突。
4.在controller中写更新api时本打算先在@modelAttibute方法中根据id获取记录,然后在更新方法入参中获取记录同时把request中参数注入其中,这样就不会导致某些未更新字段被置为空。也许你更新时会先取出记录再赋值更新,但是这要求字段数量不多而且清楚知道哪些字段更新了,不然要做很多判断,比较麻烦。
接着说,由于我前台是application/json提交的,所以后台使用@requestBody接收,结果发现接受了,但是数据库获取的记录没有,也就是直接new了一个入参对象,而不是去model中寻找@ModelAttribute方法中的对象。然后我试着把@requestBody去掉,结果不是new了对象,而是正常的从model中获取了。但是这样request请求中的参数就接收不到了。于是我试着把前台请求格式改成了表单提交的形式。可以是可以了,但是新问题又来了,某些字段转换出错。而如果使用@requestBody则不会有这样的问题。两者都不能用了,想不通为什么加了@requestBody就不去model中查找了。最后无奈的放弃了原先的方案。