Поле Spring `@ Autowire` равно нулю, хотя оно отлично работает в других классах - PullRequest
0 голосов
/ 23 октября 2018
Поле

Spring @Autowire равно null, даже если оно успешно работает в других классах.

public class SendRunner implements Runnable {

private String senderAddress;
@Autowired
private SubscriberService subscriberService;

    public SendRunner(String senderAddress) {
    this.senderAddress = senderAddress;
}

@Override
public void run() {
    sendRequest();
}

  private void sendRequest() {
    try {
        HashMap<String, String> dataMap = new HashMap<>();
        dataMap.put("subscriberId", senderAddress);
         HttpEntity<?> entity = new HttpEntity<Object>(dataMap, httpHeaders);
         Subscriber subscriber = subscriberService.getSubscriberByMsisdn(senderAddress);
        } catch (Exception e) {
          logger.error("Error occurred while trying to send api request", e);
    }
}

Также этот класс управляется как bean-компонент в сервлете диспетчера:

    <bean id="SendRunner" class="sms.dating.messenger.connector.SendRunner">
    </bean>

Здесь я получаю исключение нулевого указателя для subscriberService.Какова была бы возможная причина этого?Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Ваш компонент не находится в контексте Spring Managed, ниже могут быть причины.

  1. Пакет sms.dating.messenger.connector отсутствует в компонентном сканировании.

  2. Вы выходите из контекста Spring, создавая объект с новым (см. Ниже), таким образом вы не получите автоматические поля.

    SendRunner  sendRunner = new SendRunner () ,
    sendRunner.sendRequest();
    

Просто проверьтекак я реализую.Надеюсь, что это поможет.

@RestController
public class RestRequest {

@Autowired
SendRunner sendRunner;

@RequestMapping("/api")
public void Uri() {
    sendRunner.start();
   }
}

Класс SendRunner

@Service
public class SendRunner extends Thread{ 

@Autowired
private SubscriberService subscriberService;

@Override
public void run() {
    SendRequest();

}

private void SendRequest() {
    System.out.println("Object is " + subscriberService);
    String senderAddress = "address";
    subscriberService.getSubscriberByMsisdn(senderAddress);
}
}

Ниже приведены журналы, напечатанные, когда я нажимаю на REST api.

Объект com.example.demo.SubscriberService@40f33492

0 голосов
/ 23 октября 2018

Можете ли вы попробовать с приведенным ниже фрагментом кода

@Configuration
                public class Someclass{

                     @Autowired
                     private SubscriberService subscriberService;

                     Thread subscriberThread = new Thread() {
                                @Override
                                public void run() {
                                  try {
                        HashMap<String, String> dataMap = new HashMap<>();
                        dataMap.put("subscriberId", senderAddress);
                         HttpEntity<?> entity = new HttpEntity<Object>(dataMap, httpHeaders);
                         Subscriber subscriber = subscriberService.getSubscriberByMsisdn(senderAddress);
                        } catch (Exception e) {
                          logger.error("Error occurred while trying to send api request", e);
                    }

                                }
                            };

                }
0 голосов
/ 23 октября 2018

Можете ли вы аннотировать свой класс SendRunner с помощью @Component или @Service и включать пакет SendRunner в компонентный пакет

...