

Spring Bootでデータベースから値を取ってくる時にぬるぽが出ます。ソースは以下です。

●application.properties

[code]

    spring.datasource.url=jdbc:mysql://localhost/attendance_management 
    spring.datasource.username=root 
    spring.datasource.password=パスワード 
    spring.datasource.driverClassName=com.mysql.jdbc.Driver 
    
[/code]

●EmployeeMaster.java

[code]

    package entity;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    
    @Entity // このクラスはEntityとして登録しますよ、とspringに教えてます 
    public class EmployeeMaster { 
    
        @Id // プライマリーキーのものに設定してください 
        @GeneratedValue // 主に数字に対して、順番に一意に設定しますよ、の意味 
        protected String empID;
    
        @Column // ただの変数じゃなくて、DBのカラムだよ、の意味 
        protected String pwd;
    
        // setter & getter --------------------- 
        public String getEmpID() { 
            return empID;
        } 
    
        public void setEmpID(String employee_id) { 
            this.empID = employee_id;
        } 
    
        public void setPassword(String password) { 
            this.pwd = password;
        } 
    
        public String getPassword(){ 
            return pwd;
        } 
    
        // constructor -------------------------- 
        public EmployeeMaster(){ 
            super();
        } 
    
        public EmployeeMaster(String id, String pass){ 
            super();
            this.empID =id;
            this.pwd = pass;
        } 
    
    } 
    
[/code]

●EmployeeMasterRepository.java

[code]

    package repository; 
    
    import org.springframework.data.jpa.repository.JpaRepository; 
    import org.springframework.stereotype.Repository; 
    import org.springframework.stereotype.Service; 
    
    import entity.EmployeeMaster; 
    
    @Service 
    @Repository 
    public interface EmployeeMasterRepository extends JpaRepository<EmployeeMaster, String>{ 
    } 
    
[/code]

●ViewController.java

[code]

    package common; 
    
    import org.springframework.beans.factory.annotation.Autowired; 
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
    import org.springframework.stereotype.Component; 
    import org.springframework.stereotype.Controller; 
    import org.springframework.web.bind.annotation.RequestMapping; 
    import org.springframework.web.bind.annotation.ResponseBody; 
    
    import repository.EmployeeMasterRepository; 
    import entity.EmployeeMaster; 
    
    @Component 
    @Controller 
    @EnableAutoConfiguration 
    public class ViewController { 
    
        @Autowired(required=false) 
        // リポジトリを紐づけます 
        EmployeeMasterRepository repository; 
    
        @RequestMapping("/") 
        @ResponseBody 
        public String home() { 
    
            // 全件取得します 
            Iterable<EmployeeMaster> list = repository.findAll(); 
    
            // 取得した内容を出力します 
            for (EmployeeMaster emp : list) { 
                System.out.println(emp.getEmpID() + ":" + emp.getPassword()); 
            } 
            return "Hello!"; 
        } 
    
    } 
    
[/code]

<エラーコード>

[code]

    java.lang.NullPointerException: null 
        at common.ViewController.home(ViewController.java:29) 
        at common.ViewController$$FastClassBySpringCGLIB$$2e3276a4.invoke(<generated>) 
        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) 
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
        at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) 
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653) 
        at common.ViewController$$EnhancerBySpringCGLIB$$3d3ad38.home(<generated>) 
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
        at java.lang.reflect.Method.invoke(Method.java:606) 
        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:777) 
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706) 
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) 
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) 
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:618) 
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
        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:88) 
        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:501) 
        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:537) 
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085) 
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658) 
        at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222) 
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1556) 
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1513) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
        at java.lang.Thread.run(Thread.java:744) 
    
[/code]

なおweb.xmlなどの設定ファイルはありません。  
いくらググっても有効な解決策を見つけられなかったので質問させて頂きました。  
何卒宜しくお願い致します。

* * *

![階層構造](https://i.stack.imgur.com/DaIRY.png)

回答ありがとうございます。すみません、まだプログラミング初心者なもんで・・。  
階層構造は上記のようになっています。ご検討お願い致します。


CC BY-SA 3.0
2015-07-09T03:57:03.530
12185
2015-08-24T06:42:45.610
2015-08-24T06:42:45.610
8000
10461
question
java gradle spring nullpointerexception
Spring Bootでデータベースから値を取ってきて表示する時にNullpointerExceptionが出ます。


ComponentScanの設定が間違っているのでは？他のクラスとパッケージ構成みないとわからないですね。

しかしまぁ、アノテーションの付け方がめちゃくちゃ。。

本題と関係ありませんが、

  * `ViewController`には`@Controller`だけでOKです。`@Controller`は`@Component`の意味も兼ねているので、`@Component`が重複しています。`@EnableAutoConfiguration`はhaコントローラーにつけるものではなく、アプリケーションのエントリポイントにつけてください(`main`メソッドがあるクラス)
  * `EmployeeMasterRepository`に`@Service`も`@Repository`も不要です。`JpaRepository`を`implements`していれば認識されます。(ちなみに`JpaRepository`ではない場合も通常は`@Service`と`@Repository`は同時につけません。)


CC BY-SA 3.0
2015-07-09T09:31:23.973
12206
2015-07-09T10:41:10.160
2015-07-09T10:41:10.160
3542
3542
12185
answer


スタックトレースでViewControllerの29行目とあって微妙にViewController.javaの行数がずれているのですが、おそらく
`repository.findAll()` の部分での `NullPointerException` だと思います。

`@ComponentScan` をつけると、Spring
Frameworkがそのクラスと同じパッケージ配下のクラスを自動的にスキャンしてビーン登録などをしてくれます。  
最新のSpring Bootであれば、`@ComponentScan` を含んだ `@SpringBootApplication`
をmainメソッドのあるクラスにつけるのが普通ですが、そのクラスのパッケージとコントローラやリポジトリのコントローラが違っているので、自動コンポーネントスキャン対象になっていないとか、DI対象になっていない、などが発生しているのではないでしょうか。

その辺を見直すとよいと思います。

簡単には、`@SpringBootApplication` をつけるメインクラスをアプリのベース名のパッケージにして(たとえば
`hoge`)、他のパッケージは `hoge.common`, `hoge.repository` などとしておけば取りこぼしがなくなるはずです。

* * *

今追加されたのを見ると `Application` クラスが `common` パッケージなので、`repository`
パッケージが自動スキャンされていない→NPE発生、の流れだとおもいます。


CC BY-SA 3.0
2015-07-09T10:10:28.933
12210
2015-07-09T10:10:28.933
2356
12185
answer