Spring 带有@Autowired 结果的服务注入 NullPointerException

Spring service injection with @Autowired results NullPointerException

我正在尝试使用

GeofenceMonitoring class 中注入服务
@Autowired
private IDeviceService deviceService;

但我得到了 NullPointerException 这是服务的接口,下面是它的实现:

IDeviceService

package com.sifast.gpstracking.service;

import java.util.List;

import org.springframework.transaction.annotation.Transactional;

import com.sifast.gpstracking.model.Device;
import com.sifast.gpstracking.service.util.IGenericService;

@Transactional
public interface IDeviceService extends IGenericService<Device, Integer> {
    Device findDeviceByUniqueId(String uniqueId);

    List<Device> findAllDevice();

}

设备服务

package com.sifast.gpstracking.service.impl;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.sifast.gpstracking.dao.impl.DeviceDao;
import com.sifast.gpstracking.model.Device;
import com.sifast.gpstracking.service.IDeviceService;
import com.sifast.gpstracking.service.util.GenericService;

@Service("deviceService")
public class DeviceService extends GenericService<Device, Integer> implements IDeviceService, Serializable {
    private static final long serialVersionUID = 1L;
    @Autowired
    private DeviceDao deviceDao;

    @Override
    public Device findDeviceByUniqueId(String uniqueId) {
        Query query = deviceDao.getSession().getNamedQuery("findDeviceByUniqueId").setString("uniqueId", uniqueId);
        return deviceDao.findOne(query);
    }

    @Override
    public List<Device> findAllDevice() {

        return deviceDao.findAll(Device.class);
    }
}

当我尝试注入服务时: 地理围栏监控

package com.sifast.gpstracking.webServiceRest;

import java.util.ArrayList;
import java.util.List;

import org.primefaces.model.map.LatLng;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;

import com.sifast.gpastracking.monitoring.IMonitor;
import com.sifast.gpstracking.model.Device;
import com.sifast.gpstracking.model.Geofence;
import com.sifast.gpstracking.model.GeofenceDevice;
import com.sifast.gpstracking.model.Point;
import com.sifast.gpstracking.push.DevicePositionData;
import com.sifast.gpstracking.service.IDeviceService;
import com.sifast.gpstracking.service.util.IntersectionGeofence;

@ComponentScan("com.sifast.gpstracking")
public class GeofenceMonitor implements IMonitor {
    ArrayList<Geofence> geofences = new ArrayList<Geofence>();
    GeofenceDevice geofenceDevice;
    Boolean geofenced=false;

    public static final Logger logger = LoggerFactory.getLogger(GeofenceMonitor.class);

    @Autowired
    private IDeviceService serviceDevice;

    public GeofenceMonitor() {
    }

    @Override
    public void updateMonitor(DevicePositionData devicePositionData) {


        //logger.debug("DEVICE ID = " + devicePositionData.getUniqueId());
        Device device = serviceDevice.findDeviceByUniqueId(devicePositionData.getUniqueId());
        LatLng currentPosition = new LatLng(devicePositionData.getLatitude(), devicePositionData.getLongitude());

        for (GeofenceDevice geofenceDevice : device.getListGeofenceDevice()) {
           List<LatLng> listPoint = convertListPointToListLatLng(geofenceDevice.getGeofence().getListPoint());
           logger.debug("SIZE =====> "+listPoint.size());
           if (IntersectionGeofence.isPointInsidePolygon(currentPosition, listPoint))
           {
               geofenced = true;
               logger.debug("Le device " + devicePositionData.getDeviceName() + " a dépassé la zone limitée");
               break;
           }
        } 

    }

    private List<LatLng> convertListPointToListLatLng(List<Point> listPoint)
    {
        List<LatLng> listLatLng = new ArrayList<LatLng>();
        for (Point point : listPoint){
            listLatLng.add(new LatLng(point.getLatitude(),point.getLongitude()));
        }
        return listLatLng;
    }

}

最后ApplicationContext.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:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
          http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
          http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
          http://www.springframework.org/schema/mvc
          http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <mvc:annotation-driven />

    <!-- Activates scanning of annotations -->
    <context:component-scan base-package="com.sifast.gpstracking" />
    <context:annotation-config/>
    <context:spring-configured/>

    <!-- Database Configuration -->
    <import resource="/database/dataSource.xml" />
    <import resource="/database/hibernate.xml" />

    <!-- Transaction Manager is defined -->
    <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <!-- Enable the configuration of transactional behavior based on annotations -->
    <tx:annotation-driven transaction-manager="txManager" />
    <mvc:annotation-driven></mvc:annotation-driven>
    <!-- Pour avoir accès au resources comme les fichiers /js et /css lorsqu'on utilise un mapping / avec le servletDispatcher dans le web.xml -->
    <mvc:resources mapping="/css/**" location="/resources/css/" /> 
    <mvc:resources mapping="/images/**" location="/resources/images/" /> 

    <!-- Init DataBase -->
    <bean id="dbInit"
        class="org.springframework.jdbc.datasource.init.ResourceDatabasePopulator">
        <property name="scripts">
            <list>
                <value>classpath:sql/1.0.0/CreateData.sql</value>
            </list>
        </property>
        <property name="continueOnError" value="true" />
    </bean>

    <bean id="startupScripts"
        class="org.springframework.jdbc.datasource.init.DataSourceInitializer">
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>
        <property name="databasePopulator">
            <ref bean="dbInit" />
        </property>
    </bean>

</beans>

因为IDeviceService是一个接口。 Spring 不知道你想自动装配哪个实例,因为自动装配的默认方式是按类型,如果我没记错的话。

试试这个

@Autowired
@Qualifier("deviceService")
private IDeviceService deviceService;

先试试双星

<context:component-scan base-package="com.sifast.gpstracking.**" />

通过applicationContext.getBean()

获取bean的简单示例

http://www.mkyong.com/spring/quick-start-maven-spring-example/

而你想在web环境下获取,你可以注入。

How to inject ApplicationContext itself

您的 GeofenceMonitor bean 是否已在应用程序上下文中注册?从您的代码片段中,它缺少原型注释(@Component / @Service 等),因此不会自动检测到它,也不会注入任何指定的依赖项。更改 @ComponentScan("com.sifast.gpstracking") public class GeofenceMonitor 实现 IMonitor 到 @Component public class GeofenceMonitor 实现 IMonitor

问题是我正在使用 new GeofenceMonitor() 在服务 class 中创建一个新的 GeofenceMonitor 实例,该实例旨在处理 Web 服务调用。 所以我修改为@Scope("singleton")并添加了@PostConstruct private void init()。下面是我的代码:

位置通知(网络服务class)

@Service("positionNotification")
@Path("/positionNotification")
@Scope("singleton")
public class PositionNotification implements Serializable, IMonitorable {
    private static final long serialVersionUID = 1L;

    @Autowired
    private GeofenceMonitor geofence;



    private static ArrayList<IMonitor> monitors;
    /*static {
        monitors = new ArrayList<IMonitor>();
        monitors.add(new SpeedMonitor());
        monitors.add(geofence);
    }*/


    @Autowired
    private IDeviceService deviceService;
    @Autowired
    private IPositionService positionService;
    private final static String CHANNEL = "/notify";
    public static final Logger logger = LoggerFactory.getLogger(PositionNotification.class);
    private static final int STATUS_OK = 200;



    @PostConstruct
    private void init(){
        monitors = new ArrayList<IMonitor>();
        monitors.add(new SpeedMonitor());
        monitors.add(geofence);
    }


    @POST
    @Path("/getGeoLocFromDevice")
    public Response test(@FormParam("LATITUDE") String latitude, @FormParam("LONGITUDE") String longitude, @FormParam("DEVICE_ID") String uniqueId,
            @FormParam("SPEED") String speed, @FormParam("Horodateur") String date) {

        logger.debug("X long: " + latitude + " __ Y lat: " + longitude + " uniqueId  " + uniqueId + " " + date);
        Device device = deviceService.findDeviceByUniqueId(uniqueId);
        if (device != null) {
            if (speed == null) {
                speed = "0";
            }

            String address = AddressResolver.AddressReseolve(latitude, longitude);
            DevicePositionData devicePositionData = new DevicePositionData();

            devicePositionData.setLatitude(Double.valueOf(latitude));
            devicePositionData.setLongitude(Double.valueOf(longitude));
            devicePositionData.setUniqueId(uniqueId);
            devicePositionData.setAddress(address);
            devicePositionData.setDeviceName(device.getName());

            devicePositionData.setSpeed(Double.parseDouble(speed));
            devicePositionData.setIcon(device.getType().getIconActive());

            Position position = new Position();
            position.setAddress(address);
            position.setLatitude(Double.valueOf(latitude));
            position.setLongitude(Double.valueOf(longitude));
            if (date != null) {
                try {
                    position.setDatePosition(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse(date));
                    devicePositionData.setDatePosition(date);
                    device.setLastUpdate(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse(date));
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            } else {
                position.setDatePosition(new Date());
                devicePositionData.setDatePosition(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(new Date()));
                device.setLastUpdate(new Date());
            }

            position.setSpeed(Double.parseDouble(speed));
            position.setDevice(device);
            positionService.saveOrUpdateService(position);

            deviceService.saveOrUpdateService(device);

            if (EventBusFactory.getDefault() != null) {
                EventBus eventBus = EventBusFactory.getDefault().eventBus();
                eventBus.publish(CHANNEL, devicePositionData);
            }
            notifyMonitors(devicePositionData);
        }

        return Response.status(STATUS_OK).build();
    }

    @Override
    public void notifyMonitors(DevicePositionData devicePositionData) {
        for (IMonitor monitor : monitors) {
            monitor.updateMonitor(devicePositionData);
        }

    }

    @Override
    public void addMonitor(IMonitor monitor) {
        monitors.add(monitor);
    }

    @Override
    public void deleteMonitor(IMonitor monitor) {
        monitors.remove(monitor);

    }

    @Override
    public void clearMonitors() {
        monitors.clear();
    }
}