2013-10-05 2 views
0

JSF 기술로 createBook.xhtml이고 관리 Beans를 사용하는 웹 응용 프로그램을 만들었습니다. 이 페이지에서 사용자는 입력 필드에 필수 정보를 입력하고 제출 버튼을 누르십시오. 그런 다음이 정보는 doCreateBook() 메서드를 사용하여 데이터베이스에 유지되어야합니다. 이 웹 응용 프로그램에 Tomcat 7.0 서버를 사용합니다.javax.naming.NameNotFoundException : 이름 [attribute name]이이 컨텍스트에 바인드되어 있지 않습니다. [클래스 이름]을 (를) 찾을 수 없습니다.

의이 내가 얻을 오류 메시지가 먼저 시작하자 :

package com.mysite.bookecommerce.beans; 

import java.io.Serializable; 

import javax.ejb.EJB; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.RequestScoped; 

import com.mysite.bookecommerce.entities.Book; 

@ManagedBean(name = "BookController") 
@RequestScoped 
public class BookController implements Serializable { 

private static final long serialVersionUID = 1L; 

@EJB 
private BookEJB bookEJB; 

private Book book = new Book(); 

public String doCreateBook() throws Exception{ 
    book = bookEJB.createBook(book); 
    return "bookCreationSuccessful.xhtml"; 
} 

public void doDeleteBook() throws Exception{ 
    bookEJB.deleteBook(book); 
} 

public void doUpdateBook() throws Exception { 
    book = bookEJB.updateBook(book); 
} 

public BookController() { 
    super(); 
} 

} 

BookEJB 클래스는 다음과 같습니다 :

javax.naming.NameNotFoundException: Name [com.mysite.bookecommerce.beans.BookController/bookEJB] is not bound in this Context. Unable to find [com.mysite.bookecommerce.beans.BookController].

BookController는 것은 코드는 EJB입니다

package com.mysite.bookecommerce.beans; import java.util.List; import javax.ejb.Stateful; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContextType; import javax.persistence.Query; import com.mysite.bookecommerce.entities.Book; @Stateful public class BookEJB { @PersistenceContext(unitName = "BookECommercePU", type = PersistenceContextType.EXTENDED) private EntityManager em; public Book createBook(Book book) throws Exception { em.persist(book); return book; } public void deleteBook(Book book) throws Exception { em.remove(book); } public Book updateBook(Book book) throws Exception { em.merge(book); return book; } @SuppressWarnings("unchecked") public List<Book> getBooks() throws Exception { Query query = em.createQuery("SELECT b from Book AS b"); return query.getResultList(); } } 

@Entity 
@Table(name = "BOOKS") 
public class Book { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long ID; 

@Column(nullable = false) 
private String name; 

@Column(nullable = false, length = 2000) 
private String description; 

@Length(max = 10) 
@Column(nullable = false) 
private int isbn10; 

@Length(max = 14) 
private String isbn13; 

@Column(nullable = false) 
private String author; 

private String publisher; 
private int publishYear; 

@Column(nullable = false) 
private int numberOfPages; 

@Column(nullable = false) 
private double price; 

private boolean illustrations; 
private String dimension; 
private double weight; 
private int quantity; 

//getters and setters 

또한 faces-config.xml 파일 :

<?xml version="1.0" encoding="UTF-8"?> 

<faces-config 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" 
version="2.0"> 

<managed-bean> 
    <managed-bean-name>BookController</managed-bean-name> 
    <managed-bean-class>com.mysite.bookecommerce.beans.BookController</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
</managed-bean> 

그리고 마지막의 web.xml 코드 :

예약 코드는 엔티티 클래스입니다

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>BookECommerce</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> </welcome-file-list> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.xhtml</url-pattern> </servlet-mapping> <context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> </context-param> <context-param> <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name> <param-value>resources.application</param-value> </context-param> <context-param> <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>client</param-value> </context-param> <context-param> <param-name>org.apache.myfaces.ALLOW_JAVASCRIPT</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>org.apache.myfaces.PRETTY_HTML</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>org.apache.myfaces.DETECT_JAVASCRIPT</param-name> <param-value>false</param-value> </context-param> <context-param> <param-name>org.apache.myfaces.AUTO_SCROLL</param-name> <param-value>true</param-value> </context-param> <listener> <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class> </listener> 

문제는 내 웹 응용 프로그램이 해당 BookController EJB를 찾지 못하는 것 같습니다. 어떻게 해결할 수 있을까요? 나는 당신이 faces-config.xml 파일에 그것을 추가해야한다는 것을 읽었지만 나는 그것을 추가했고 여전히 나는이 에러를 얻는다.

북 엔티티 클래스의 모든 가져 오기 행은 코드 스 니펫을 길게 만들었 기 때문에 가져 왔음을 유의하십시오.

답변

2

여기에 여러 가지주의 할 사항이 있습니다

  1. 톰캣은 서블릿 컨테이너가 아닌 Glassfish 또는 JBoss 같은 실제 자바 EE 애플리케이션 서버이기 때문에 CDI 및 EJB 일반 Tomcat이 작동하지 않습니다

    . this question에서 좀 더 자세한 내용을 확인할 수 있습니다.

  2. CDI를 실제로 사용하려면 javax.enterprise.context 패키지의 주석 (예 : javax.enterprise.context.RequestScoped)을 사용해야합니다.

  3. faces-config.xml에있는 bean 선언은 JSF 2+에서 선택 사항입니다.

+0

TomEE를 설치하면 웹 응용 프로그램이 작동합니다. 고마워요 :) –

관련 문제