2016-10-09 3 views
0

봄과 동면을 사용하고 있습니다.ID로 엔티티를 가져 오는 동안 java.lang.NullPointerException이 발생했습니다

내 엔티티 :

package com.igorgorbunov3333.core.entities.domain; 

import com.igorgorbunov3333.core.entities.enums.Proceeding; 

import javax.persistence.*; 
import java.util.Date; 

/** 
* Created by Игорь on 03.04.2016. 
*/ 

@Entity 
@Table(name = "cases") 
@NamedQueries({ 
    @NamedQuery(name = "getAllCases", query = "SELECT c FROM Case c JOIN FETCH c.client JOIN FETCH c.firstInstance " + 
      "JOIN FETCH c.secondInstance JOIN FETCH c.thirdInstance JOIN FETCH c.category") 
}) 
public class Case { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 

    @Column(name = "case_number") 
    private String caseNumber; 

    @ManyToOne 
    @JoinColumn(name = "client_id") 
    private Client client; 

    @OneToOne 
    @JoinColumn(name = "first_instance_id") 
    private FirstInstance firstInstance; 

    @OneToOne 
    @JoinColumn(name = "second_instance_id") 
    private SecondInstance secondInstance; 

    @OneToOne 
    @JoinColumn(name = "third_instance_id") 
    private ThirdInstance thirdInstance; 

    @Enumerated(EnumType.ORDINAL) 
    private Proceeding proceeding; 

    @Temporal(TemporalType.DATE) 
    @Column(name = "closing_date") 
    private Date closingDate; 

    @ManyToOne 
    @JoinColumn(name = "category_id") 
    private Category category; 

    private float price; 

    public long getId() { 
     return id; 
    } 

    public String getCaseNumber() { 
     return caseNumber; 
    } 

    public Client getClient() { 
     return client; 
    } 

    public FirstInstance getFirstInstance() { 
     return firstInstance; 
    } 

    public SecondInstance getSecondInstance() { 
     return secondInstance; 
    } 

    public ThirdInstance getThirdInstance() { 
     return thirdInstance; 
    } 

    public Proceeding getProceeding() { 
     return proceeding; 
    } 

    public Date getClosingDate() { 
     return closingDate; 
    } 

    public Category getCategory() { 
     return category; 
    } 

    public float getPrice() { 
     return price; 
    } 

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

    public void setCaseNumber(String caseNumber) { 
     this.caseNumber = caseNumber; 
    } 

    public void setClient(Client client) { 
     this.client = client; 
    } 

    public void setFirstInstance(FirstInstance firstInstance) { 
     this.firstInstance = firstInstance; 
    } 

    public void setSecondInstance(SecondInstance secondInstance) { 
     this.secondInstance = secondInstance; 
    } 

    public void setThirdInstance(ThirdInstance thirdInstance) { 
     this.thirdInstance = thirdInstance; 
    } 

    public void setProceeding(Proceeding proceeding) { 
     this.proceeding = proceeding; 
    } 

    public void setClosingDate(Date closingDate) { 
     this.closingDate = closingDate; 
    } 

    public void setCategory(Category category) { 
     this.category = category; 
    } 

    public void setPrice(float price) { 
     this.price = price; 
    } 
} 

봄-config.xml에 다음

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd" > 

    <[email protected] annotation support --> 
    <tx:annotation-driven transaction-manager="transactionManager"/> 

    <!--Scanning components in base-package (look for annotations) --> 
    <context:component-scan base-package="com.igorgorbunov3333"/> 

    <!--Activates various annotations to be detected in bean classes: Spring's @Required and @Autowired and so on--> 
    <context:annotation-config/> 

    <!--Обеспечивает работу с транзакциями в Spring --> 
    <bean id="transactionManager" 
      class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="emf"/> 
    </bean> 

    <!-- Datasource. Источник данных - база MySQL --> 
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://localhost:3306/database" /> 
     <property name="username" value="root" /> 
     <property name="password" value="root" /> 
    </bean> 

    <!-- EntityManagerFactory --> 
    <bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <!--Поставщик данных - hibernate--> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
     </property> 
     <!--поиск сущностей в этом пакете--> 
     <property name="packagesToScan" 
        value="com.igorgorbunov3333"/> 
     <!--детали конфигурации поставщика постоянства (hibernate) --> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.dialect"> 
        org.hibernate.dialect.MySQL5Dialect 
       </prop> 
       <prop key="hibernate.max_fetch_depth">3</prop> 
       <prop key="hibernate.jdbc.fetch_size">50</prop> 
       <prop key="hibernate.jdbc.batch_size">10</prop> 
       <prop key="hibernate.show_sql">true</prop> 
      </props> 
     </property> 
    </bean> 


</beans> 

내가지고있어 NullPointerException이 :

public Case findById(long id) { 
    return entityManager.find(Case.class, id); 
} 

있는지 나는 당신에게 - ID는 정확하지만 엔티티를 찾을 수 없습니다. 그러나 모든 항목을 모두 훌륭하게 처리 할 때 :

public List<Case> findAll() { 
    Query query = entityManager.createNamedQuery("getAllCases"); 
    return query.getResultList(); 
} 

이유가 무엇입니까? NPE의

전체 트랙 :

09-Oct-2016 12:40:41.650 SEVERE [http-nio-8080-exec-7] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [ShowSingleCase] in context with path [] threw exception 
java.lang.NullPointerException 
    at com.igorgorbunov3333.core.entities.service.impl.CaseServiceImpl.findById(CaseServiceImpl.java:32) 
    at com.igorgorbunov3333.web.servlet.display.single.ShowSingleCase.doGet(ShowSingleCase.java:29) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
    at org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:522) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) 
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:1096) 
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:760) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1480) 
    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) 

내 CaseServiceImpl :

package com.igorgorbunov3333.core.entities.service.impl; 

import com.igorgorbunov3333.core.entities.domain.Case; 
import com.igorgorbunov3333.core.entities.enums.CaseStatus; 
import com.igorgorbunov3333.core.entities.service.api.CaseService; 
import com.igorgorbunov3333.core.util.DateUtil; 
import org.springframework.stereotype.Repository; 
import org.springframework.stereotype.Service; 

import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.persistence.Query; 
import java.util.*; 

/** 
* Created by Игорь on 27.07.2016. 
*/ 

@Repository 
@Service("CaseService") 
public class CaseServiceImpl implements CaseService { 

    @PersistenceContext 
    private EntityManager entityManager; 

    public Case findById(long id) { 
     return entityManager.find(Case.class, id); 
    } 
} 

서블릿 :

package com.igorgorbunov3333.web.servlet.display.single; 

import com.igorgorbunov3333.core.entities.domain.Case; 
import com.igorgorbunov3333.core.entities.service.api.CaseService; 
import com.igorgorbunov3333.core.entities.service.impl.CaseServiceImpl; 

import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.io.IOException; 

import static com.igorgorbunov3333.web.util.Views.SINGLE_CASE_PAGE; 

/** 
* Created by Игорь on 09.08.2016. 
*/ 
@WebServlet(name = "ShowSingleCase", urlPatterns = "/showSingleCase") 
public class ShowSingleCase extends HttpServlet { 
    private CaseService caseService = new CaseServiceImpl(); 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     doGet(request, response); 
    } 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     long id = Long.valueOf(request.getParameter("caseID")); 
     Case c = caseService.findById(id); 

     request.setAttribute("case", c); 

     request.getRequestDispatcher(SINGLE_CASE_PAGE).forward(request, response); 
    } 
} 
+1

NPE에는 스택 추적이 있습니다. 그래서 –

+0

@Neil Stockton 게시, 완료! –

+0

CaseServiceImpl에서 "entityManager"를 어떻게 설정합니까? –

답변

0

귀하의 문제는이 라인에 있습니다

private CaseService caseService = new CaseServiceImpl(); 

의존성 주입 작동 안하는 방법입니다. CaseService 객체를 수동으로 인스턴스화합니다. 이 경우 프레임 워크는 종속성을 주입하지 않으므로 private EntityManager entityManager; 필드는 null이됩니다. 대신 caseService 필드에 @Autowired 특수 효과로 주석을 달아야합니다. 즉 문맥에서 빈을 주입하는 봄을 말할 것이다 : 당신이 당신의 서블릿 클래스에서 스스로 CaseServiceImpl 클래스의 객체를 생성되기 때문에

@Autowired 
private CaseService caseService; 
+0

당신은 나를 도와주세요, 그것은 매우 어리석은 실수입니다 :) –

0

null이 될 수있는 유일한 일을 라인에 (원시되지 않습니다) 당신은 엔티티 매니저가 문제가 될 것이라고 언급 했으므로, 보이지 않는 이것에 대한 근본적인 이유를 찾고 있습니다. 당신이 올린 코드.

+0

찾기에 실패하면 null이 반환되고 예외는 throw되지 않으며 원시 문자는 null 일 수 없습니다. 게다가 매개 변수가 null이고 find가 문제가되는 경우 예외는 find 메소드 내에서 발생합니다. –

0

은을 EntityManager 객체는 스프링에 의해 자동으로 autowire하기되지 않고, 그건 당신이 NullPointerException이 점점 이유입니다. 서블릿 클래스에 서비스 클래스 객체를 autowire하여 Spring이 entityManager 종속성을 스스로 해결하고 완전한 구성 서비스 객체를 제공하거나 서블릿에 객체를 생성하는 동안 엔티티 관리자 객체를 서비스 클래스로 설정해야합니다.

관련 문제