Jakarta ee 无法获得;对",;servlet中的有状态会话bean

Jakarta ee 无法获得;对",;servlet中的有状态会话bean,jakarta-ee,servlets,jsf-2,jboss,ejb-3.1,Jakarta Ee,Servlets,Jsf 2,Jboss,Ejb 3.1,首先:祝大家圣诞快乐:) 我在servlet中接收有状态会话bean时遇到一些问题。简单地说,JSF应该设置的值就是空值。我拥有的是一个JSF页面+一个有状态会话bean+临时属性bean类+servlet: 首先是JSF2.0页面的一部分: <h:form id="set_args"> <h2>Prosze wprowadzic wartosci: (w przyszlosci...)</h2> <div cla

首先:祝大家圣诞快乐:)

我在servlet中接收有状态会话bean时遇到一些问题。简单地说,JSF应该设置的值就是空值。我拥有的是一个JSF页面+一个有状态会话bean+临时属性bean类+servlet:

首先是JSF2.0页面的一部分:

    <h:form id="set_args">
        <h2>Prosze wprowadzic wartosci: (w przyszlosci...)</h2>
        <div class="group">
            <h:outputLabel for="start" value="Wybierz punkt startowy:" />
            <h:inputText id="start" value="#{properties.start}" />
        </div>
        <div class="group">
            <h:outputLabel for="stop" value="Wybierz punkt docelowy:" />
            <h:inputText id="stop" value="#{properties.end}" />
        </div>
        <div class="group">
            <h:commandButton id="start_sim"
                action="#{SimulationBean.setValues()}" value="Rozpocznij" />
        </div>
    </h:form>
然后是一个EJB:

@Named("SimulationBean")
@Stateful
@SessionScoped
@NamedQueries({ @NamedQuery(name = "findAllJunctions", query = "SELECT j FROM Junction") })
public class SimulationBean implements SimulationBeanLocal {

@Inject
private Properties properties;

private String start;

private String end;

public String getStart() {
    return start;
}

public void setStart(String start) {
    this.start = start;
}

public String getEnd() {
    return end;
}

public void setEnd(String end) {
    this.end = end;
}

public void setValues() {
    this.start = this.properties.getStart();
    this.end = this.properties.getEnd();
    System.out.println("Print VALUES:");
    System.out.println(this.properties.getStart());
    System.out.println(this.properties.getEnd());
}
和servlet:

@WebServlet("/SimulationServlet")
@EJB(name="SimulationBean", beanInterface = SimulationBeanLocal.class)
public class SimulationServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void processRequest(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    Context c;
    try {
        c = new InitialContext();
        SimulationBeanLocal bean = (SimulationBeanLocal) c.lookup("java:module/SimulationBean");
当我调用servlet时,我在“开始”和“结束”属性中得到一个空值。 一切都充满了战争

我真的做错了什么吗?:)我会很感激任何线索。
谢谢。

servlet显然是由不同于JSF表单提交的HTTP请求调用的。由于
Properties
bean是请求作用域,因此每个HTTP请求都将创建一个新实例,而不是像您预期的那样重用以前HTTP请求中的实例。相反,您需要访问在有状态EJB中设置的值,或者访问范围比请求范围更广的其他bean


但总而言之,整个结构有点奇怪和混乱。你在这里混合了几个概念和职责。由于问题中根本没有详细阐述功能需求,因此不可能提出正确的方法。

servlet显然是由不同于JSF表单提交的HTTP请求调用的。由于
Properties
bean是请求作用域,因此每个HTTP请求都将创建一个新实例,而不是像您预期的那样重用以前HTTP请求中的实例。相反,您需要访问在有状态EJB中设置的值,或者访问范围比请求范围更广的其他bean


但总而言之,整个结构有点奇怪和混乱。你在这里混合了几个概念和职责。由于问题中根本没有详细阐述功能需求,因此不可能提出正确的方法。

与问题无关:我不认为您应该在SFSB中使用
@namedquerys
。这是JPA的职责,应在JPA实体或映射的超类中使用
@namedquerys
/
@NamedQuery
,如下所述:。WesołychŚwiąt:-)是的,你是绝对正确的,它从未被使用过,应该被扔掉,但我在发布之前根本没有这样做。与问题无关:我不认为你应该在SFSB中使用
@namedquerys
。这是JPA的职责,应在JPA实体或映射的超类中使用
@namedquerys
/
@NamedQuery
,如下所述:。WesołychŚwiąt:-)是的,你完全正确,它从未使用过,应该扔掉,但我在发布之前根本没有这样做。非常感谢你的回复,首先我解释我想做什么。我想要一个JSF中的表单(我已经有了),您可以在其中键入某些内容的开始值和结束值(实际上这是一个路由,但并不重要)。然后将Properties类注入到有状态bean中,并在一个sevlet中多次获取该bean(同一个bean,已经设置了值)。在SimulationBean类中,当bean第一次被调用时,我会记住Properties类中的值(JSF按钮的操作触发“setValues()”方法)。我想要一个JSF中的表单(我已经有了),您可以在其中键入某些内容的开始值和结束值(实际上这是一个路由,但并不重要)。然后将Properties类注入到有状态bean中,并在一个sevlet中多次获取该bean(同一个bean,已经设置了值)。在SimulationBean类中,当bean第一次被调用时,我记得Properties类中的值(JSF按钮的操作触发“setValues()”方法)。
@WebServlet("/SimulationServlet")
@EJB(name="SimulationBean", beanInterface = SimulationBeanLocal.class)
public class SimulationServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void processRequest(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    Context c;
    try {
        c = new InitialContext();
        SimulationBeanLocal bean = (SimulationBeanLocal) c.lookup("java:module/SimulationBean");