拒绝自动装配的 class 的自动装配成员
Autowire members of a class that refuses to auto-wire
我有一个 class "ReportEverythingForm" 拒绝通过自动装配注释实例化 class "ReportQueryDetailsDAO"。
如果我添加一个通过 "new" 实例化 class "ReportQueryDetailsDAO" 的 hack,那么 class "reportQueryDetailsDAO" 将不会实例化其自动装配的字段,例如实体管理器,然后将导致空异常。
@Component
public class ReportEverythingForm
{
@Autowired
ReportQueryDetailsDAO reportQueryDetailsDAO;
public ReportEverythingForm() {
//reportQueryDetailsDAO = new ReportQueryDetailsDAO();//HACK FIXME Autowired is null
}
class "ReportEverythingForm" 由控制器class "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>
尝试改变
public ReportEverythingForm() {
//reportQueryDetailsDAO = new ReportQueryDetailsDAO();//HACK FIXME Autowired is null
}
到
@Autowired
public ReportEverythingForm(ReportQueryDetailsDAO reportQueryDetailsDAO) {
this.reportQueryDetailsDAO = reportQueryDetailsDAO;
}
(我认为您需要该构造函数在您的 ReportEverythingForm 中设置一些初始状态)
同时从 ReportQueryDetailsDAO reportQueryDetailsDAO
字段中删除 @Autowired
注释
编辑
另一个解决方案是使用 @PostConstruct 注释,并删除您的构造函数。这样您就可以在 @PostConstruct
注释方法
中设置初始状态
最有可能的问题是 ReportEverythingForm
是通过 - new
手动实例化的。问题是你无法在 @Autowired
字段上获得 null
- 如果你没有要自动装配的 bean,你将在上下文初始化时遇到异常。检查你的代码
ReportEverythingForm
和 ReportQueryDetailsDAO
由 spring 实例化。您可以定义 xml
bean 条目或使用 @ComponentScan
或使用 @Bean
注释。
我有一个 class "ReportEverythingForm" 拒绝通过自动装配注释实例化 class "ReportQueryDetailsDAO"。 如果我添加一个通过 "new" 实例化 class "ReportQueryDetailsDAO" 的 hack,那么 class "reportQueryDetailsDAO" 将不会实例化其自动装配的字段,例如实体管理器,然后将导致空异常。
@Component
public class ReportEverythingForm
{
@Autowired
ReportQueryDetailsDAO reportQueryDetailsDAO;
public ReportEverythingForm() {
//reportQueryDetailsDAO = new ReportQueryDetailsDAO();//HACK FIXME Autowired is null
}
class "ReportEverythingForm" 由控制器class "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>
尝试改变
public ReportEverythingForm() {
//reportQueryDetailsDAO = new ReportQueryDetailsDAO();//HACK FIXME Autowired is null
}
到
@Autowired
public ReportEverythingForm(ReportQueryDetailsDAO reportQueryDetailsDAO) {
this.reportQueryDetailsDAO = reportQueryDetailsDAO;
}
(我认为您需要该构造函数在您的 ReportEverythingForm 中设置一些初始状态)
同时从 ReportQueryDetailsDAO reportQueryDetailsDAO
字段中删除 @Autowired
注释
编辑
另一个解决方案是使用 @PostConstruct 注释,并删除您的构造函数。这样您就可以在 @PostConstruct
注释方法
最有可能的问题是 ReportEverythingForm
是通过 - new
手动实例化的。问题是你无法在 @Autowired
字段上获得 null
- 如果你没有要自动装配的 bean,你将在上下文初始化时遇到异常。检查你的代码
ReportEverythingForm
和 ReportQueryDetailsDAO
由 spring 实例化。您可以定义 xml
bean 条目或使用 @ComponentScan
或使用 @Bean
注释。