EJB 및 JSF 관리 Bean의 책임이 혼합되어 있습니다. faces-config.xml
은 EJB가 아닌 관리 Bean과 같은 JSF 아티팩트 만 등록합니다. faces-config.xml
<managed-bean>
<managed-bean-name>personManager</managed-bean-name>
<managed-bean-class>ejb.PersonManager</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
의 등록은 기본적으로 동일 즉
@ManagedBean
@SessionScoped
public class PersonManager {
// ...
}
으로 JSF가
#{personManager}
에 의해 뷰에서 볼 수 있습니다 콩 관리, 당신은 클래스를 등록하고한다. 이것은 EJB 컨테이너가 관리하는 것과 동일한 인스턴스를 나타내지 않습니다.
아니요
faces-config.xml
을 사용하면 EJB를 등록 할 수 있습니다. 여기서 패키지의 주석 (예 :
@Stateless
및
@Stateful
)을 사용합니다. EJB를 등록하기 만하면됩니다.
사실, 등록 JSF는 faces-config.xml
에 콩 관리는 새로운 @ManagedBean
주석으로 대체되었습니다 JSF 2.x에서에있는 오래된 JSF 1.x에서 방법입니다.
업데이트 적절한 접근 방법은 다음과 같습니다
보기합니다 (Facelets의 파일) :
<h:form>
<h:inputText value="#{personManager.person.name}" />
...
<h:commandButton value="Save" action="#{personManager.save}" />
<h:messages />
</h:form>
컨트롤러합니다 (JSF가 관리 Bean) :
@ManagedBean
@ViewScoped
public class PersonManager implements Serializable {
private Person person;
@EJB
private PersonService personService;
@PostConstruct
public void init() {
person = new Person();
}
public void save() {
personService.create(person);
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage("Person successfully created, new ID is " + person.getId()));
}
// ...
}
모델 (JPA 엔티티) :
@Entity
public class Person implements Serializable {
@Id
private Long id;
private String name;
// ...
}
서비스 (상태 비 EJB) :
@Stateless
public class PersonService {
@PersistenceContext
private EntityManager em;
public void create(Person person) {
em.persist(person);
}
// ...
}
왜 얼굴-config.xml 파일에 선언하는 대신 수동으로 @EJB 주석을 사용하지 않는 ?? 주석이 발명되지 않은 과거로 되돌아 가려고하는 것과 같습니다 : P –
당신이 옳습니다 :- 단지 이론적 인 말입니다. 나는 답을 알고 싶습니다. – Forty
@ Forty 그럼 왜 작동하지 않습니까? 대답은 분명하지 않습니다. –