2017-05-15 4 views
1

Ich verwende innerhalb der Controller-Autowired-Repository meiner Anwendung, die gut funktioniert. Aber ich möchte meinen Repo auch in einer anderen Klasse verwenden. Aber wenn ich eine Methode aus der zweiten Klasse aufrufen bekomme ich Null Zeiger Ausnahme, sieht aus wie Autowiring funktioniert nicht innerhalb dieser Klasse. Was mache ich falsch? Ist es nicht möglich, den gleichen Repo mehr als einmal zu autowire? Oder vielleicht sollte ich Service implementieren und meinen Repo über Service anrufen?Second Autowired REST Repository funktioniert nicht

Fehler:

2017-05-15 16:27:52.193 ERROR 6624 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[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: null 
    at com.logic.RecommendationEngine.generatedRecommendation(RecommendationEngine.java:116) ~[classes/:na] 
    at com.controllers.HomeController.showRecommendation(HomeController.java:46) ~[classes/:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_60] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_60] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_60] 
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_60] 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) ~[spring-web-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:116) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) ~[tomcat-embed-core-8.5.11.jar:8.5.11] 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) ~[spring-webmvc-4.3.7.RELEASE.jar:4.3.7.RELEASE] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) ~[tomcat-embed-core-8.5.11.jar:8.5.11] 

Repo-Schnittstelle:

public interface FundRepository extends CrudRepository<Fund, Long>{} 

-Controller mit Repo:

@RestController 
public class RestServiceController { 

    @Autowired 
    private FundRepository fundRepo; 

    //Some not related methods 
} 

Zweite Klasse mit dem gleichen Repo:

public class RecommendationEngine { 

    @Autowired 
    private FundRepository fundRepo; 

    //Method that invokes method from fundRepo but causes null pointer because fundRepo is null 
} 
+0

Wie haben Sie das Objekt von RecommendationEngine initialisiert? – Afridi

+0

@Afridi 'RecommendationEngine re = new RecommendationEngine()' innerhalb der HomeController-Methode. –

+1

Sie müssen das Objekt von RecommendationEngine automatisch initiieren, anstatt mit 'new' Operator – Afridi

Antwort

1

initialisieren Ihr Objekt RecommendationEngine Klasse @Autowired

@Autowired 
RecommendationEngine engine; 

Und Ihre RecommendationEngine-Klasse wie so aussehen sollte:

@Component 
public class RecommendationEngine { 

    @Autowired 
    private FundRepository fundRepo; 

    //Method that invokes method from fundRepo but causes null pointer because fundRepo is null 
} 
1

Q: Aber wenn ich eine Methode aus der zweiten Klasse aufrufen I Null-Zeiger Ausnahme erhalten, sieht aus wie autowiring nicht innerhalb dieser Klasse arbeiten. Was mache ich falsch?

A: Es ist normal, da Ihre RecommendationEngine Klasse kein Frühling Bohne ist ==> nicht durch die Feder Kontext behandelt. Damit es funktioniert, sollten Sie es als Bean konfigurieren (mit Annotation oder XML config).

Q: Ist es unmöglich, die gleiche Repo mehr als einmal Autowire?

A: Sie können Ihre Frühlings Bohnen so viele nennen, wie Sie wollen.

-1

Versuchen Sie, Ihre RecommendationEngine mit @Service mit Anmerkungen zu versehen, so dass der Frühling Container kann es als ein Spring-Bean (Managed Object) abholen

@Service 
public class RecommendationEngine { 

    @Autowired 
    private FundRepository fundRepo; 
} 

Einige andere Klasse u es mit verwenden können:

@Controller 
public class HomeController { 

    @Autowired 
    private RecommendationEngine recommendationEngine; 


    // use it 

} 

Alternativ können Sie Projekt Lombok: https://projectlombok.org/ verwenden, um den Boilerplate-Code für Ihre Abhängigkeiten in Ihrer Klasse zu reduzieren.

Beispiel mit Lombok:

@Controller 
@RequiredArgsConstructor 
public class HomeController { 

    private final RecommendationEngine recommendationEngine; 
    private final SomeOtherDependeny dependency; 


    // use it 

} 

Keine Notwendigkeit zur manuellen @Autowired!

+0

zu initialisieren, für den ich downvooted wurde? – Dachstein

Verwandte Themen