所以我试图在这个Java应用程序中运行一个SQL查询。我想我已经正确设置了DAO,但是找不到包含查询的XML文件。我的DAO实现中有问题的代码是:
private Properties queries;
public void setQueries(Properties queries) {
this.queries = queries;
}
public Boolean checkAssigned(String Id) {
String sql = queries.getProperty("CHECK_IF_ASSIGNED");
Map<String,Object> params = new HashMap<>();
List<String> assignedList;
params.put(":Id",Id);
LOG.info("Checking to see if already assigned \n" + "sql=" + sql
+ "\n" + "params=" + params);
assignedList = getNamedParameterJdbcTemplate().query(sql,params,
new assignedMapper());
if (assignedList == null || assignedList.size() == 0) {
ScreenVo.setSwitch(false);
}
else {
ScreenVo.setSwitch(true);
}
return ScreenVo.getSwitch();
}
我的DAO就是:
public interface ScreenDao {
Boolean checkAssigned(String Id);
}
我的query.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
<util:properties id="queries">
<prop key="CHECK_IF_ASSIGNED">
<![CDATA[
--Long query
]]>
</prop>
</util:properties>
</beans>
applicationContext.xml中用于dao的bean是:
<bean id="screenDaoImpl" class="com.corp.apps.actionator.dao.ScreenDaoImpl">
<property name="dataSource" ref="datasource"/>
<property name="queries" ref="queries"/>
</bean>
我在applicationContext中查询文件的声明是:
<import resource="classpath:queries.xml"/>
它以类似的方式在我的web.xml中声明。
我试图包括所有可能相关的内容。我试过在ScreenDaoImpl.java中自动装配Bean,但这没有用。我真的不确定从哪里去,或者我做错了什么。
编辑: 我得到的例外是:
javax.faces.event.MethodExpressionActionListener.processAction java.lang.NullPointerException
我的screenDaoImpl在使用前声明为:
private static ScreenDao screenDao = new ScreenDaoImpl();
答案 0 :(得分:0)
Spring-Bean screenDaoImpl
必须通过Spring上下文创建,在这种情况下,Spring可以在创建的bean中注入所需的属性(dataSource
和queries
)。
我不知道您的应用程序架构。但我可以为您提供几种方法。
1-如果要在spring-xml中声明的spring-bean中使用screenDaoImpl,则可以这样做:
<bean id="screenServiceImpl" class="com.corp.apps.actionator.service.ScreenServiceImpl">
<property name="screenDao" ref="screenDaoImpl"/>
</bean>
更好的方法是在Spring中创建所有应用程序。并通过spring-context xml创建(并注入)bean。不要通过new
创建bean对象。 Spring无法在这些对象中注入属性。
如果困难,则尝试在Spring网站上找到应用程序示例。也许尝试spring-boot(不带xml)。
2-如果要在非弹簧对象中使用screenDaoImpl,则可以通过“桥”从弹簧上下文中获取screenDaoImpl。创建课程:
package com.corp.apps.actionator.util;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class AppSpringBridge implements ApplicationContextAware {
private static ApplicationContext context;
public void setApplicationContext(ApplicationContext context) throws BeansException {
this.context = context;
}
public static ApplicationContext getApplicationContext() {
return context;
}
}
在application-context.xml中定义bean:
<bean id="springBridge" class="com.corp.apps.actionator.util.AppSpringBridge />
Spring创建了这个bean,但是这个bean的方法getApplicationContext()
(和context
属性)是静态的。我们可以在任何方法中使用getApplicationContext()
:
ScreenDao screenDao = (ScreenDao)AppSpringBridge.getApplicationContext().getBean("screenDaoImpl");
答案 1 :(得分:0)
我已修复它,为了后代,我将在此处发布我的解决方案:
首先我将我的screenDao bean自动连接到调用类中,然后创建一个静态方法来设置screenDao。
@Autowired
private static ScreenDao screenDao;
@PostConstruct
public static void setScreenDao(ScreenDao newScreenDao) {
screenDao = newScreenDao;
}
@PostConstruct
public ScreenDao getScreenDao() {
return screenDao;
}
我不太确定getScreenDao是否可以执行任何操作,但我也添加了它。
然后在我的应用程序上下文中,我创建了一个称为initialize的bean来调用静态方法。
<bean id="initialize" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass" value="com.corp.apps.consolidator.backing.ScreenBean"/>
<property name="targetMethod" value="setScreenDao"/>
<property name="arguments">
<list>
<ref bean="screenDao"/>
</list>
</property>
</bean>
这两个更改解决了我的问题。