线程随tomcat启动后,注入dao报空指针异常什么原因

相逢都是久别重逢 发布于 2016/06/01 10:20
阅读 754
收藏 1
package org.lichengmeng.thread;

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

import java.io.IOException;
import java.io.InputStream;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import org.lichengmeng.dao.TemperatureMapperDao;
import org.lichengmeng.entity.Temperature;
import org.springframework.stereotype.Component;

/**
 * 读取串口数据并写入数据库
 * @author Administrator
 *
 */

@Component
public class TempReadAndSave {
	
	
	private TemperatureMapperDao dao;
	
	@Resource
	public void setDao(TemperatureMapperDao dao)
	{
		this.dao=dao;
	}
	
	@PostConstruct
    public void init()
    {
		try {
			(new TempReadAndSave()).connect("COM4");
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
	
    void connect ( String portName ) throws Exception
    {
        CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
        if ( portIdentifier.isCurrentlyOwned() )
        {
            System.out.println("Error: Port is currently in use");
        }
        else
        {
            CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);
            
            if ( commPort instanceof SerialPort )
            {
                SerialPort serialPort = (SerialPort) commPort;
                
                serialPort.setSerialPortParams(4800,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
                
                InputStream in = serialPort.getInputStream();
                
               (new Thread(new SerialReader(in))).start();

            }
            else
            {
                System.out.println("Error: Only serial ports are handled by this example.");
            }
        }     
    }
    
    
     class SerialReader implements Runnable 
    {
        InputStream in;
        
        public SerialReader ( InputStream in )
        {
            this.in = in;
        }
        
        public void run ()
        {
            int data[] = new int[8];
            float temp,decade,unit;
            int i = 0;
            try
            {
                while (true)
                {
                	data[i++] = in.read();
                    if(i>=7)
                    {
                		
                		for( int j=0; j<7 ;j++)
                		{
                			if((data[j] == -1) && (j+1 <= 6) && (data[j+1] != -1))
                			{
                				decade = Integer.valueOf(Integer.toHexString(data[++j]));
                				unit = Integer.valueOf(Integer.toHexString(data[++j]));
                				temp = decade + unit/10;
                                //dao操作
                				Temperature temperature = new Temperature();
                				temperature.setTemperature(temp);
                				dao.insertTemp(temperature);
                				//System.out.println(temp);
              				
                		    }
                            
                	    }
                		i=0;
                    }

                }                
            }
            catch ( IOException e )
            {
                e.printStackTrace();
            }finally
            {
            	try {            		
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
            }            
        }
    }
}

dao为什么会报空指针异常




加载中
0
戢冠生
戢冠生
(newTempReadAndSave()).connect("COM4"); 改成  connect("COM4");就好。
相逢都是久别重逢
感谢大神 成功写入数据库了
0
xpbob
xpbob
@Resource默认也是按照名字的吧,你应该装配的应该是实现类,如果你没有实现多态,你可以使用自动装配,或者明确指定实现类的名字
0
spring配置文件或者TemperatureMapperDao类展示一下
0
相逢都是久别重逢

引用来自“卝”的评论

spring配置文件或者TemperatureMapperDao类展示一下
package org.lichengmeng.dao;

import java.util.List;

import org.lichengmeng.annotation.MyBatisDao;
import org.lichengmeng.entity.Temperature;

@MyBatisDao
public interface TemperatureMapperDao {
    public List<Temperature> findAllTemp();
    public void insertTemp(Temperature temp);

}

应该是Spring 注释@PostConstruct的问题,这个实在bean实例化之前执行的,但我必须在系统启动时线程开始工作。不知道该怎么解决



如果你觉得是@PostConstruct的问题,那我就不懂了。。我暂时还没用过这个注解(也是新手,你懂得、、)
其实我想看你究竟引用的哪个类。。。引用dao的注解和spring配置的dao
0
戢冠生
戢冠生

很简单啊! 你的对象是new 出来的。 不是spring ioc容器管理的! 当然dao==null!!!

相逢都是久别重逢
回复 @戢冠生 : 那应该改成啥样,新手一脸懵逼
戢冠生
戢冠生
回复 @相逢都是久别重逢 : TempReadAndSave 是new出来的,不受ioc管理,所以他的成员变量没有被spring注入!所有的变量都是null。
相逢都是久别重逢
dao是spring管理的呀
返回顶部
顶部