代码之家  ›  专栏  ›  技术社区  ›  Adder

自动关联拒绝自动关联[重复]的类的成员

  •  1
  • Adder  · 技术社区  · 6 年前

    如果我添加一个通过“new”实例化类“ReportQueryDetailsDAO”的hack,那么类“ReportQueryDetailsDAO”将不会像实体管理器那样实例化其自动连接字段,这将导致空异常。

    @Component
    public class ReportEverythingForm
    {
        @Autowired
        ReportQueryDetailsDAO reportQueryDetailsDAO;
    
        public ReportEverythingForm() {
            //reportQueryDetailsDAO = new ReportQueryDetailsDAO();//HACK FIXME Autowired is null
        }
    

    类“ReportEverythingForm”由控制器类“MonitorReportController”实例化和调用。自动布线似乎在这里工作。

    @Controller
    public class MonitorReportController
    {
        @Autowired
        private ReportEverythingForm reportEverythingForm;
    
    @Transactional
    @RequestMapping(value = "/reportEverything", method = RequestMethod.POST)
    public ModelAndView getReportEverything(HttpServletRequest request,
            HttpServletResponse response, HttpSession session, Locale locale)
    {
        //code which calls methods of "reportEverythingForm"
    

    我怎样才能让自动布线工作?它适用于代码的其他部分,所以我想这不是一个一般性的问题。

    一些相关的进口产品包括:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.transaction.annotation.Transactional;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.servlet.ModelAndView;
    

    按要求提供“ReportQueryDetailsDao”的内容:

    @Repository
    public class ReportQueryDetailsDAO
    {
    
        private static final Logger logger = LoggerFactory
                .getLogger(ReportQueryDetailsDAO.class);
    
        @PersistenceContext(unitName = "RATOR_MONITORING_CONFIGURATION", type = PersistenceContextType.TRANSACTION)
        private EntityManager entityManager;
    
    
        /**
         * @param sql
         * @return
         */
        @Transactional
        public ReportQueryDetail findbySQLId(Long sqlId)
        {
            try
            {
                //Query query = entityManager.createNativeQuery("select * from REPORT_QUERY_DETAILS where REPORT_QUERY_DETAILS_ID = :sqlId");
                logger.info("select rqd from ReportQueryDetail rqd where rqd.reportQueryDetailsId = " + sqlId);
                Query query = entityManager.createQuery("select rqd from ReportQueryDetail rqd where rqd.reportQueryDetailsId = :sqlId");
                query.setParameter("sqlId", sqlId);
    
                List<ReportQueryDetail> results = query.getResultList();
                ReportQueryDetail reportQueryDetail = (ReportQueryDetail) results.get(0);
    
                return reportQueryDetail;
            } catch (Exception e)
            {
                logger.debug("Exception:" + e.getMessage(), e);
                return null;
            }
        }
    

    摘自pom.xml:

    <java-version>1.6</java-version>
    <org.springframework-version>3.1.1.RELEASE</org.springframework-version>
    <org.aspectj-version>1.6.10</org.aspectj-version>
    <org.slf4j-version>1.6.6</org.slf4j-version>
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   aBnormaLz    6 年前

    public ReportEverythingForm() {
        //reportQueryDetailsDAO = new ReportQueryDetailsDAO();//HACK FIXME Autowired is null
    }
    

    @Autowired
    public ReportEverythingForm(ReportQueryDetailsDAO reportQueryDetailsDAO) {
        this.reportQueryDetailsDAO = reportQueryDetailsDAO;
    }
    

    (我认为您需要该构造函数在ReportEverythingForm中设置一些初始状态)

    同时拆下 @Autowired 来自 ReportQueryDetailsDAO reportQueryDetailsDAO 领域

    另一个解决方案是使用 @PostConstruct 注释,并删除构造函数。有了它,您就可以在应用程序中设置初始状态 @PostConstruct

        2
  •  0
  •   Oleksandr Papchenko    6 年前

    ReportEverythingForm 通过- new . 问题是你不能得到 null @Autowired 字段-若并没有要自动连接的bean,则在上下文初始化时会出现异常。签入你的代码 报告一切形式 ReportQueryDetailsDAO 是由spring实例化的。您可以定义 xml @ComponentScan 或使用 @Bean 注释。