liruo233
2019-04-03 15:05
采纳率: 50%
浏览 528
已采纳

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条回答 默认 最新

  • 我叫周利东 2019-04-03 15:42
    已采纳
    @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是用于处理请求的

    点赞 评论
  • Vane11 2019-04-03 15:24

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

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

    点赞 评论
  • GzlAndy 2019-04-03 18:00

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

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

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

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

    点赞 评论
  • devmiao 2019-04-04 00:04

    通过页面请求发现代码真正逻辑是页面请求了一个子类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方法,子类方法中调用父类方法时,就不会出现父类不发生注入的问题了。

    点赞 评论
  • 无明之徒 2019-04-04 13:30
    点赞 评论

相关推荐 更多相似问题