0

I have the following REST controller:

@RestController
@RequestMapping("/api/v1/slices")
public class SlicesControllerImpl implements SlicesController {

    private static final org.edgexfoundry.support.logging.client.EdgeXLogger logger =
  org.edgexfoundry.support.logging.client.EdgeXLoggerFactory
      .getEdgeXLogger(SlicesControllerImpl.class);


    @RequestMapping(method = RequestMethod.POST)
    @Override
    public void addSlice() {
        logger.info("Mediator received request to add slice.");
        Operations operations = new Operations();
        operations.getMetadata();
    }
}

Class Operations is:

@Service
public class Operations {

    @Autowired
    private DeviceClient deviceClient;

    public void getMetadata() {
        List<Device> devices = deviceClient.devices();
        System.out.println("Devices received: " + devices);
    }

}

where for DeviceClient I have added the following dependency in my pom.xml:

<core-metadata-client.version>0.5.0-SNAPSHOT</core-metadata-client.version>
...

<dependency>
    <groupId>org.edgexfoundry</groupId>
    <artifactId>core-metadata-client</artifactId>
    <version>${core-metadata-client.version}</version>
</dependency>

When I hit the, I get the following error:

...
...

[2019-02-07 12:11:46.788] boot - 1  INFO [http-nio-5252-exec-2] ---  SlicesControllerImpl: Mediator received request to add slice. 

[2019-02-07 12:11:46.807] boot - 1 ERROR [http-nio-5252-exec-2] --- [dispatcherServlet]: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException
    at org.edgexfoundry.mediatorLogic.Operations.getMetadata(Operations.java:80)
    at org.edgexfoundry.controller.impl.SlicesControllerImpl.addSlice(SlicesControllerImpl.java:66)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:832)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:743)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:961)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:895)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:87)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

Any ideas why the variable DeviceClient cannot be autowired and its method is null?

Marievi
  • 4,951
  • 1
  • 16
  • 33

3 Answers3

3

Isn't it because of Operations operations = new Operations();? You make new instance of Operations so private DeviceClient deviceClient; is null because it's outside Spring context. I guess.

You should @Autowired Operations too in SlicesControllerImpl

kszulchs
  • 114
  • 10
3

In your SlicesControllerImpl, do not instantiate Operation as below,

Operations operations = new Operations();

Instead use like below,

@Autowired
Operations operations;

Then call operations.getMetadata();

Santosh
  • 874
  • 11
  • 21
1
logger.info("Mediator received request to add slice.");
Operations operations = new Operations();
operations.getMetadata();

You are creating a new instance of the Operations class outside of the Spring Container. It has no idea of that instance.

@RestController
@RequestMapping("/api/v1/slices")
public class SlicesControllerImpl implements SlicesController {

  private static final org.edgexfoundry.support.logging.client.EdgeXLogger logger = org.edgexfoundry.support.logging.client.EdgeXLoggerFactory
      .getEdgeXLogger(SlicesControllerImpl.class);

  private final Operations operations;

  public SlicesControllerImpl(Operations operations) {
    this.operations = operations;
  }

  @RequestMapping(method = RequestMethod.POST)
  @Override
  public void addSlice() {
    logger.info("Mediator received request to add slice.");
    operations.getMetadata();
  }
}

Singular constructors are automatically attempted for autowiring since Spring 4.x

Popovkov57
  • 179
  • 16
Darren Forsythe
  • 10,712
  • 4
  • 43
  • 54