简体   繁体   中英

Spring boot JPA CrudRepository throws NullPointerException on save

When I try to save data and list by a restful web service, I get the NullPointerException error

ApiRestService.java

package com.twitterservice.service;
@RestController
public class ApiRestService {

    private static final Logger logger = LoggerFactory.getLogger(ApiRestService.class);

    @Autowired(required = true)
    ApiRepository ApiRepo;
    TwitterRepository TwitRepo;

    @RequestMapping(value = "/rest/twitterapi", method = RequestMethod.POST, produces = "application/json")
    @ResponseBody
    public ResponseEntity<ApiDomain> saveApiKeys(@RequestBody ApiDomain request) {
        ApiRepo.save(request);
        return new ResponseEntity<ApiDomain>(request, HttpStatus.OK);

    }

    @RequestMapping(value = "/rest/twitter", method = RequestMethod.GET)
    @SuppressWarnings("empty-statement")
    public Iterable<TwitterDomain> getAll() throws TwitterException {
        ApiDomain apikeys = ApiRepo.findOne(1L);
        ConfigurationBuilder xb = new ConfigurationBuilder();
        xb.setDebugEnabled(true)
                .setOAuthConsumerKey(apikeys.getConsumerKey())
                .setOAuthConsumerSecret(apikeys.getConsumerSecret())
                .setOAuthAccessToken(apikeys.getAccessToken())
                .setOAuthAccessTokenSecret(apikeys.getAccessTokenSecret());

        TwitterFactory tf = new TwitterFactory(xb.build());
        twitter4j.Twitter tw = tf.getInstance();
        List<Status> statuses = tw.getHomeTimeline();
        for (Status a : statuses) {

            TwitRepo.save(new TwitterDomain(a.getUser().getName(), a.getText(), "stable"));

        }

        Iterable<TwitterDomain> lst = TwitRepo.findAll();

        return lst;
    }
}

ApiDomain.java

package com.twitterservice.dao;
@Entity
public class ApiDomain implements Serializable {
    
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String accountName;
    private String consumerKey;
    private String consumerSecret;
    private String accessToken;
    private String accessTokenSecret;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getAccountName() {
        return accountName;
    }

    public void setAccountName(String accountName) {
        this.accountName = accountName;
    }

    public String getConsumerKey() {
        return consumerKey;
    }

    public void setConsumerKey(String consumerKey) {
        this.consumerKey = consumerKey;
    }

    public String getConsumerSecret() {
        return consumerSecret;
    }

    public void setConsumerSecret(String consumerSecret) {
        this.consumerSecret = consumerSecret;
    }

    public String getAccessToken() {
        return accessToken;
    }

    public void setAccessToken(String accessToken) {
        this.accessToken = accessToken;
    }

    public String getAccessTokenSecret() {
        return accessTokenSecret;
    }

    public void setAccessTokenSecret(String accessTokenSecret) {
        this.accessTokenSecret = accessTokenSecret;
    }

    public ApiDomain(String accountName, String consumerKey, String consumerSecret, String accessToken, String accessTokenSecret) {
        this.accountName = accountName;
        this.consumerKey = consumerKey;
        this.consumerSecret = consumerSecret;
        this.accessToken = accessToken;
        this.accessTokenSecret = accessTokenSecret;
    }
public ApiDomain() {
    }
  
    
}

TwitterDomain

    package com.twitterservice.dao;
    
    @Entity
    public class TwitterDomain implements Serializable {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private long id;
        private String twitteruser;
        private String twittertext;
        private String status;
    
        public String getTwitteruser() {
            return twitteruser;
        }
    
        public void setTwitteruser(String twitteruser) {
            this.twitteruser = twitteruser;
        }
    
        public String getTwittertext() {
            return twittertext;
        }
    
        public void setTwittertext(String twittertext) {
            this.twittertext = twittertext;
        }
    
        public String getStatus() {
            return status;
        }
    
        public void setStatus(String status) {
            this.status = status;
        }
    
        public TwitterDomain(String twitteruser, String twittertext, String status) {
            
            this.twitteruser = twitteruser;
            this.twittertext = twittertext;
            this.status = status;
        }
    
        public TwitterDomain() {
        }
        
    

}

myrepository

 package com.twitterservice.repository;


import org.springframework.data.repository.CrudRepository;

public interface TwitterRepository extends CrudRepository<TwitterDomain, Long> {

    List<TwitterDomain> findByTwittertext(String twittertext);
}

And error when I call to service

java.lang.NullPointerException: null
at com.twitterservice.service.ApiRestService.getAll(ApiRestService.java:71)
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:497)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:858)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
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:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
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:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
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:142)
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:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

handle to error this row

 TwitRepo.save(new TwitterDomain(a.getUser().getName(), a.getText(), "stable"));

This happens because you autowired only the ApiRepository field.

The @Autowired applies to the first below field, not to all fields in the class, you need to add the annotation on every field you want to inject.

@Autowired(required = true)
private ApiRepository ApiRepo;
@Autowired(required = true)
private TwitterRepository TwitRepo;

I face the same issue and after researching it I found that:

  • Case 1: If you are not creating constructor explicitly and did not initialize all the dependencies that your are using it will throw nullPointerException

  • Case 2: If you are using dependencies and did not put @Autowired annotations it will throw nullPointerException

  • Case 3: If you are not using @AllArugConstructor annotation at class level it will throw nullPointerException .

You need to used one of them to avoid nullPointerException on the save method.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM