使用springmvc遇到的问题

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中查找了。最后无奈的放弃了原先的方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值