我有一个需要调用runnable类的服务。
以下是我的服务中使用的代码行。
@Autowired
private LinkBrc2MemberProfile brcTask;
// Background Task.
SimpleAsyncTaskExecutor sate = new SimpleAsyncTaskExecutor();
sate.createThread(new LinkBrc2MemberProfile(user));
这是我的Runnable类
@Service
public class LinkBrc2MemberProfile implements Runnable {
private final Logger log = LoggerFactory.getLogger(LinkBrc2MemberProfile.class);
@Autowired
private LoyaltyDao dao;
private Member member;
public LinkBrc2MemberProfile() {
super();
}
public LinkBrc2MemberProfile(Member member) {
this.member = member;
}
public void run() {
log.debug("*** Member User Name: " + member.getString("USER_NAME"));
String emailAddress = member.getString("USER_NAME");
Map<String, Object> map = dao.findBrcByEmailAddress( emailAddress );
log.debug("==========================================================");
if( ! map.isEmpty() ) {
try {
//a.CUSTOMER_ID, a.EMAIL_ADDRESS, b.card_no
String customerId = (String) map.get("CUSTOMER_ID");
String brcCardNumber = (String) map.get("CARD_NO");
log.debug("\ncustomerId: " + customerId + " brcCardNumber: " + brcCardNumber);
if(!brcCardNumber.equals("")) {
// Add the Be Rewarded Card.
HashMap<String, String> userAttributes = new HashMap<String, String>();
String brcNumber = member.getString("BREWARDED_CARD_NO");
if (brcNumber.equals("")) {
userAttributes.put("BREWARDED_CARD_NO", brcCardNumber);
try {
member.putAll(userAttributes);
} catch (Exception e) {
String errorMessage = "Unable to save user's BRC information due to: " + e.getMessage();
log.error("{}", errorMessage);
}
}
}
} catch (Exception e) {
log.error(e.getMessage());
e.printStackTrace();
}
}
}
我没有在日志中看到任何错误,但同时它似乎没有调用Runnable类。我在哪里错过了注释?有什么好的例子可以指出我,我发现的唯一一个使用XML文件来配置我想使用注释的可运行类。在此先感谢。
我已更新我的服务以执行以下操作。
请帮助,我的DAO是NULL,所以看起来我的Runnable类中的@Autowired没有连接它。
我已将以下bean添加到我的bean-config.xml文件中。
<bean id="brcType" class="com.ws.ocp.service.LinkBrc2MemberProfile" scope="prototype"/>
我删除了@Autowired注释并将以下内容添加到我的服务类中。
ClassPathResource rsrc = new ClassPathResource("bean-config.xml");
XmlBeanFactory factory = new XmlBeanFactory(rsrc);
LinkBrc2MemberProfile brcTask = (LinkBrc2MemberProfile) factory.getBean("brcType");
SimpleAsyncTaskExecutor sate = new SimpleAsyncTaskExecutor();
// Set Member attribute
brcTask.setMember(user);
// Executer
sate.execute(brcTask);
为什么我的dao仍为null?
答案 0 :(得分:6)
runnable将抛出一个NullPointerException
,因为你自己创建它(使用new
运算符),而不是让Spring创建它。这显然意味着自动装配的DAO属性不会自动装配,这会在调用NPE
时导致dao.findBrcByEmailAddress(...)
。
您应该从bean工厂获取Runnable
实例(作为原型),设置其成员属性,然后将其提交给执行者。
答案 1 :(得分:2)
要回答关于如何正确使用Prototype-Bean的问题,这是我最喜欢的方式:
@Component
abstract class MyBean {
/* Factory method that will be installed by Spring */
@Lookup
protected abstract YourPrototypeBean createBean();
void someCode() {
YourPrototypeBean bean = createBean();
}
}
由于它是一种工厂方法,您可以根据需要创建任意数量的实例。