先贴代码
单例类:
/***
* 文书号服务类(单例)
* @author oyh
*
*/
public class DocNumberSingleton{
private String docNumberType1;//文书类型1 ---号
private String docNumberType2;//文书类型2 ---号
private String docType;// 文书类型
@Resource
private IUtilDao iUtilDao;
private static DocNumberSingleton instance = new DocNumberSingleton();
private DocNumberSingleton(){
}
/**
* 获取实例
* @return 唯一的instance
*/
public static DocNumberSingleton getInstance() {
/**
* 初始化值 不同文书类型的当前文书号的最大值Something
*/
instance.setDocNumberType1("00001");
instance.setDocNumberType2("00001");
String hql = "from TDocNumber tn where tn.maxMark=0 and tn.isDele=0";
try {
List<TDocNumber> objList = (List<TDocNumber>) instance.iUtilDao.getHqlQuery(hql);
if(objList!=null&&objList.size()>0){
for (TDocNumber tDocNumber : objList) {
if(tDocNumber.getDocType().getId()=="1"){
instance.setDocNumberType1(tDocNumber.getDocNumber());
}else if(tDocNumber.getDocType().getId()=="2"){
instance.setDocNumberType2(tDocNumber.getDocNumber());
} }
}
} catch (Exception e) {
e.printStackTrace();
}
return instance;
} /***
*
* 根据doc类型 返回一个当前需要的文书号
* @param docType
* @return
*
*/
public String getDocNumber(String docType){
/**
* 内容:
* 1.先把当前的需要的文书号得到(是当前数据库值+1)
* 2.在把当前类型的最大的文书号值+1
*
* */
try{
DDocType docTypeObj = (DDocType) this.iUtilDao.getObjectById(DDocType.class, docType);
String docNumber = "";
String num = "";
int tempNum = 0;
if(docType=="1"||"1".equals(docType)){
num = this.getDocNumberType1();
tempNum = Integer.parseInt(num);
tempNum = tempNum + 1;
docNumber = formatNumber(tempNum);
this.setDocNumberType1(docNumber);
}else if(docType=="2"||"2".equals(docType)){
num = this.getDocNumberType2();
tempNum = Integer.parseInt(num);
tempNum = tempNum + 1;
docNumber = formatNumber(tempNum);
this.setDocNumberType2(docNumber);
} String hql = "from TDocNumber tn where tn.docType.id='"+docType+"' tn.maxMark=0 and tn.isDele=0 ";
List<TDocNumber> objList = (List<TDocNumber>) instance.iUtilDao.getHqlQuery(hql);
if(objList!=null&&objList.size()>0){
TDocNumber obj = objList.get(0);
obj.setMaxMark(1);
this.iUtilDao.update(obj);
TDocNumber numObj = new TDocNumber();
numObj.setDocType(docTypeObj);
numObj.setIsDele(0);
numObj.setMaxMark(0);
numObj.setDocNumber(this.getDocNumberType1());
numObj.setVersion(Util.version);
this.iUtilDao.save(numObj);
}
return docNumber;
}catch (Exception e) {
e.printStackTrace();
}
return "";
}
/***
* 将int文书号转化成格式文书号 如: 11--->000011
* @return
*/
public String formatNumber(int num){
String docNumber = "";
if(num<10){
docNumber = "00000"+String.valueOf(num);
}else if(num<100){
docNumber = "0000"+String.valueOf(num);
}else if(num<1000){
docNumber = "000"+String.valueOf(num);
}else if(num<10000){
docNumber = "00"+String.valueOf(num);
}else if(num<100000){
docNumber = "0"+String.valueOf(num);
}else{
docNumber = String.valueOf(num);
}
return docNumber;
}
public String getDocNumberType1() {
return docNumberType1;
} public void setDocNumberType1(String docNumberType1) {
this.docNumberType1 = docNumberType1;
} public String getDocNumberType2() {
return docNumberType2;
} public void setDocNumberType2(String docNumberType2) {
this.docNumberType2 = docNumberType2;
}
public String getDocType() {
return docType;
} public void setDocType(String docType) {
this.docType = docType;
} public static void setInstance(DocNumberSingleton instance) {
DocNumberSingleton.instance = instance;
} public IUtilDao getiUtilDao() {
return iUtilDao;
} public void setiUtilDao(IUtilDao iUtilDao) {
this.iUtilDao = iUtilDao;
}
}
因为是使用注解来注入的,但是,当我在Action层调用单例时,
ServletActionContext.getResponse().setContentType("text/xml;charset=utf-8");
PrintWriter out = null;
out = ServletActionContext.getResponse().getWriter();
try{
DocNumberSingleton docObj = DocNumberSingleton.getInstance();
String num = docObj.getDocNumber(docType);
out.write("1");
out.flush();
out.close();
}catch (Exception e) {
e.printStackTrace();
}
当运行到单例类中的初始化 instance.iUtilDao.getHqlQuery(hql)时, 直接报instance.iUtilDao为null
debug进去 ,instance已经实例化了,但是iUtilDao是为空的,
很明显是Spring没有注入
请问,有人做过类似的麽?
谢谢
单例类:
/***
* 文书号服务类(单例)
* @author oyh
*
*/
public class DocNumberSingleton{
private String docNumberType1;//文书类型1 ---号
private String docNumberType2;//文书类型2 ---号
private String docType;// 文书类型
@Resource
private IUtilDao iUtilDao;
private static DocNumberSingleton instance = new DocNumberSingleton();
private DocNumberSingleton(){
}
/**
* 获取实例
* @return 唯一的instance
*/
public static DocNumberSingleton getInstance() {
/**
* 初始化值 不同文书类型的当前文书号的最大值Something
*/
instance.setDocNumberType1("00001");
instance.setDocNumberType2("00001");
String hql = "from TDocNumber tn where tn.maxMark=0 and tn.isDele=0";
try {
List<TDocNumber> objList = (List<TDocNumber>) instance.iUtilDao.getHqlQuery(hql);
if(objList!=null&&objList.size()>0){
for (TDocNumber tDocNumber : objList) {
if(tDocNumber.getDocType().getId()=="1"){
instance.setDocNumberType1(tDocNumber.getDocNumber());
}else if(tDocNumber.getDocType().getId()=="2"){
instance.setDocNumberType2(tDocNumber.getDocNumber());
} }
}
} catch (Exception e) {
e.printStackTrace();
}
return instance;
} /***
*
* 根据doc类型 返回一个当前需要的文书号
* @param docType
* @return
*
*/
public String getDocNumber(String docType){
/**
* 内容:
* 1.先把当前的需要的文书号得到(是当前数据库值+1)
* 2.在把当前类型的最大的文书号值+1
*
* */
try{
DDocType docTypeObj = (DDocType) this.iUtilDao.getObjectById(DDocType.class, docType);
String docNumber = "";
String num = "";
int tempNum = 0;
if(docType=="1"||"1".equals(docType)){
num = this.getDocNumberType1();
tempNum = Integer.parseInt(num);
tempNum = tempNum + 1;
docNumber = formatNumber(tempNum);
this.setDocNumberType1(docNumber);
}else if(docType=="2"||"2".equals(docType)){
num = this.getDocNumberType2();
tempNum = Integer.parseInt(num);
tempNum = tempNum + 1;
docNumber = formatNumber(tempNum);
this.setDocNumberType2(docNumber);
} String hql = "from TDocNumber tn where tn.docType.id='"+docType+"' tn.maxMark=0 and tn.isDele=0 ";
List<TDocNumber> objList = (List<TDocNumber>) instance.iUtilDao.getHqlQuery(hql);
if(objList!=null&&objList.size()>0){
TDocNumber obj = objList.get(0);
obj.setMaxMark(1);
this.iUtilDao.update(obj);
TDocNumber numObj = new TDocNumber();
numObj.setDocType(docTypeObj);
numObj.setIsDele(0);
numObj.setMaxMark(0);
numObj.setDocNumber(this.getDocNumberType1());
numObj.setVersion(Util.version);
this.iUtilDao.save(numObj);
}
return docNumber;
}catch (Exception e) {
e.printStackTrace();
}
return "";
}
/***
* 将int文书号转化成格式文书号 如: 11--->000011
* @return
*/
public String formatNumber(int num){
String docNumber = "";
if(num<10){
docNumber = "00000"+String.valueOf(num);
}else if(num<100){
docNumber = "0000"+String.valueOf(num);
}else if(num<1000){
docNumber = "000"+String.valueOf(num);
}else if(num<10000){
docNumber = "00"+String.valueOf(num);
}else if(num<100000){
docNumber = "0"+String.valueOf(num);
}else{
docNumber = String.valueOf(num);
}
return docNumber;
}
public String getDocNumberType1() {
return docNumberType1;
} public void setDocNumberType1(String docNumberType1) {
this.docNumberType1 = docNumberType1;
} public String getDocNumberType2() {
return docNumberType2;
} public void setDocNumberType2(String docNumberType2) {
this.docNumberType2 = docNumberType2;
}
public String getDocType() {
return docType;
} public void setDocType(String docType) {
this.docType = docType;
} public static void setInstance(DocNumberSingleton instance) {
DocNumberSingleton.instance = instance;
} public IUtilDao getiUtilDao() {
return iUtilDao;
} public void setiUtilDao(IUtilDao iUtilDao) {
this.iUtilDao = iUtilDao;
}
}
因为是使用注解来注入的,但是,当我在Action层调用单例时,
ServletActionContext.getResponse().setContentType("text/xml;charset=utf-8");
PrintWriter out = null;
out = ServletActionContext.getResponse().getWriter();
try{
DocNumberSingleton docObj = DocNumberSingleton.getInstance();
String num = docObj.getDocNumber(docType);
out.write("1");
out.flush();
out.close();
}catch (Exception e) {
e.printStackTrace();
}
当运行到单例类中的初始化 instance.iUtilDao.getHqlQuery(hql)时, 直接报instance.iUtilDao为null
debug进去 ,instance已经实例化了,但是iUtilDao是为空的,
很明显是Spring没有注入
请问,有人做过类似的麽?
谢谢
既然你是Struts+spring,action中的单例模式可以用@Scope("prototype")来注解,同时也用注解将服务层的bean注入进来。
我已经开启过bean的扫描了。 action中的单例?没明白你的意思...
我在Action中是之间调用单例的方法,
单例类更改(粉色是新增加的): @Scope("prototype")public class DocNumberSingleton{
private String docNumberType1;//文书类型1 ---号
private String docNumberType2;//文书类型2 ---号
private String docNumberType3;//文书类型3 ---号
private String docNumberType4;//文书类型4 ---号
private String docNumberType5;//文书类型5 ---号
private String docNumberType6;//文书类型6 ---号
private String docType;// 文书类型
@Resource
private IUtilDao iUtilDao;
....
....
但是还是得不到UtilDao。。还是没注入进去
我已经解决了。 把单例中需要注入Hibernate的 改为使用JDBC,
但是,JDBC得不到一个对象,只能得到对象的值,我又搜索代码把值弄到对象中去。。
解决了。
结贴