拒绝自动连线的类的自动连线成员

时间:2018-12-14 13:11:21

标签: java spring autowired

我有一个“ ReportEverythingForm”类,该类拒绝通过自动装配注释实例化一个“ ReportQueryDetailsDAO”类。 如果我添加了一个通过“ new”实例化“ ReportQueryDetailsDAO”类的技巧,则“ reportQueryDetailsDAO”类将不会实例化其自动装配字段,例如实体管理器,这将导致空异常。

@Component
public class ReportEverythingForm
{
    @Autowired
    ReportQueryDetailsDAO reportQueryDetailsDAO;

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

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

@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 个答案:

答案 0 :(得分:1)

尝试更改

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

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

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

还从@Autowired字段中删除ReportQueryDetailsDAO reportQueryDetailsDAO注释

编辑

另一种解决方案是使用@PostConstruct批注,然后删除您的构造函数。这样,您可以在带有@PostConstruct注释的方法中设置初始状态

答案 1 :(得分:0)

最有可能的问题是ReportEverythingForm是通过-new手动实例化的。事实是,您无法在null字段上获得@Autowired -如果没有可自动装配的bean,您将在上下文初始化时遇到异常。签入代码 ReportEverythingFormReportQueryDetailsDAO由spring实例化。您可以定义xml bean条目,也可以使用@ComponentScan或使用@Bean注释。