Spring将子类自动注入父类失败
@Controller
public class LoginController{

    @Resource(name="loginService")
    private IService loginService;

    @RequestMapping("/login")
    @Autowired
    public ModelAndView index(BaseClassDo logindo){
        LoginDo ll= (LoginDo) logindo;
        ModelAndView mv = new ModelAndView();
        System.out.println(logindo);
//      mv = loginService.doService(logindo);
        mv.setViewName("login");
        return mv;
    }
}

上面index方法中,初始化的时候使用断点显示logindo是自动注入成功的,显示的是子类的字段,但是之后从页面jsp跳转过来后,注入失败,显示的只有父类的两个字段,而且强转失败java.lang.ClassCastException,难道从前台传到后天还有什么讲究吗
使用@autowrie或@Resource都试过,没有用
下面是实体表

父类

public class BaseClassDo {
    /**
     * 业务类型
     */
    private String ywtype;
    /**
     * 业务状态
     */
    private String ywstate;

    getset方法略

子类


@Component("loginDo")
public class LoginDo extends BaseClassDo {
    private String job_id;
    private int worker_id;
    private String login_pw;
    private String worker_name;

    getset方法略

5个回答

@Controller
public class LoginController{

    @Resource(name="loginService")
    private IService loginService;

    @RequestMapping("/login")
    @Autowired
    public ModelAndView index(BaseClassDo logindo){
        LoginDo ll= (LoginDo) logindo;
        ModelAndView mv = new ModelAndView();
        System.out.println(logindo);
//      mv = loginService.doService(logindo);
        mv.setViewName("login");
        return mv;
    }
}

楼上说的对,你这方法上的@Autowired是想要做什么?和@RequestMapping一起用?
如果想通过方法注入的话,那新创建一个方法然后用上@Autowired注入就行了,至于@RequestMapping是用于处理请求的

qq_36951116
我叫周利东 回复liruo233: 指的是根据请求的参数绑定为相应的实体类型吗?只不过这些实体类型都继承自BaseClassDo 是吗?比如前端传job_id、worker_id、login_pw、worker_name这四个参数,这个时候在index方法的参数实际类型就是LoginDo了?然后如果前端传其他参数,那就会绑定到另一个BaseClassDo的具有这些参数对应字段的子类,是这个意思不?
大约一年之前 回复
liruo233
liruo233 我本来是想定义一个拥有如上的index方法的接口或父类,让所有controller类都继承它,这样的话方法里传递的参数就得统一了,我原本想参数的类型定义为Object或父类,然后在通过注释自动注入为对应的子类,你觉得有办法吗
大约一年之前 回复

通过页面请求发现代码真正逻辑是页面请求了一个子类Action的方法,而这个方法里面调用了父类的一个方法,此时父类里面的Service一直无法注入,对于上面所提的这种需求,实际上是需要在子类做Spring注入的同时也进行父类的Spring注入,那么这种需要这样的配置:

<bean id="barePhoneAction" class="com.eshore.crm.contrl.termmgr.mgr.action.BarePhoneAction" scope="prototype" parent="termCommonAction">
        <property name="orderVerifyApiFacade" ref="ord.bizprov.orderVerifyApiFacade"/>
        <property name="orderListQryApiFacade" ref="ord.query.orderListQryApiFacade"/>
        <property name="channelQryApiFacade" ref="cfguse.channel.channelQryApiFacade" />
</bean>

经过上面的设置以后,请求子类的Action方法,子类方法中调用父类方法时,就不会出现父类不发生注入的问题了。

一般来说,实体类是不用交由spring管理的,所以LoginDo类上不用加@Component注解

然后,在Controller层接受参数(指的是前端页面传过来的值),不用@Autowaire注解注入
接受的时候用子类类型接受,因为springmvc在传参的时候会根据你声明的参数类型去实例化对象然后将前端传过来的参数赋给该对象,
因此你声明的父类类型参数没有接受倒子类的属性值

报异常的原因是 实例化了父类对象,转为子类类型肯定要报错的,可以类型强转的原因是必须要有属于关系,才能转成功,父类对象肯定不是子类类型的呀

至于你说的初始化的时候显示的子类属性,我不太明白你说的什么意思,初始化的时候是没有值传过的,怎么确定是子类的字段

@Autowired的使用上有问题。
一般情况下,@Autowired标注在方法上的时候,会在容器初始化时去调用方法“进行赋值”,但也仅此而已了,之后的操作和@Autowired就没关系了

正常的前后端请求传递的参数是由前端传入的,并不是容器注入的

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐