为什么commandButton在我在tomcat中运行的表单中工作并且不能在glassfish中运行?

时间:2013-01-23 18:11:09

标签: ajax tomcat primefaces glassfish

我所做的是在字段中不传递任何值并发送以提供所需字段的错误消息,然后我在字段中传递值并再次发送。在tomcat中工作,请求中没有发送glassfish。有谁知道可能会发生什么?

Picture of what happens

Picture of what happens, error on console javascript

我真的不知道发生了什么事,谁知道呢? 我使用Tomcat 7和Glassfish 3,Primefaces 3.4.2 e Primefaces Extensions 0.6.2。在.ear企业项目中。

:===============:增强理解的补充。 :===============:

大家好,这个问题很难解决然后在其他地方搜索后我看到(不确定在哪里)可能是我的项目依赖项中的问题。所以我决定以primefaces网站为例,并从三个角度重现它。

  1. 使用Tomcat(工作)
  2. 运行
  3. 使用Glassfish运行(工作)
  4. 在我的项目中运行Glassfish(Not Worked)
  5. 在1和2上,只需用primefaces site示例的ctrl + C / ctrl + V,就这样:

    的index.xhtml:

    <?xml version='1.0' encoding='UTF-8' ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html lang="pt-br" 
          xmlns="http://www.w3.org/1999/xhtml"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:p="http://primefaces.org/ui">
        <f:view>
            <h:head/>
            <h:body>
                <h:form id="form">  
                    <p:panel id="panel" header="New Person">  
                        <p:messages id="msgs"/>  
                        <h:panelGrid columns="3">  
                            <h:outputLabel for="firstname" value="Firstname: *" />  
                            <p:inputText id="firstname" value="#{testMB.name}" required="true" label="Firstname">  
                                <f:validateLength minimum="2" />  
                            </p:inputText>  
                            <p:message for="firstname" display="icon"/>  
                            <h:outputLabel for="surname" value="Surname: *" />  
                            <p:inputText id="surname" value="#{testMB.name}" label="Surname" required="true">  
                                <f:validateLength minimum="2" />  
                                <p:ajax update="msgSurname" event="keyup" />  
                            </p:inputText>  
                            <p:message for="surname" id="msgSurname" display="icon"/>  
                        </h:panelGrid>  
                        <p:commandButton id="btn" value="Save" update="panel" actionListener="#{testMB.save(actionEvent)}"/>  
                    </p:panel>  
                </h:form> 
            </h:body>
        </f:view>
    </html>
    

    TestManagedBean.java:

    @ManagedBean(name="testMB")
    @RequestScoped
    public class TestManagedBean
    {
      private String name;
      private String surname;
    
      public String getName()
      {
        return this.name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    
        public String getSurname() {
            return surname;
        }
    
        public void setSurname(String surname) {
            this.surname = surname;
        }
    
      public void save(ActionEvent actionEvent) {
        addMessage(FacesMessage.SEVERITY_INFO, "TEST: " + this.name);
      }
    
      public void addMessage(FacesMessage.Severity s, String summary) {
        FacesMessage message = new FacesMessage(s, summary, null);
        FacesContext.getCurrentInstance().addMessage(null, message);
      }
    }
    

    在3,我做了同样的事情,但是通过使用计划的架构,使用shiro,facelets,布局primefaces扩展等安全过滤器...我检查了shiro并且没有过滤器阻止某些东西,其他依赖也看了,我发现在ejb模块中我声明了primefaces(因为我使用的是Sortface的SortOrder模型类),web模块也声明了primefaces和primefaces扩展。

    项目是否依赖与问题有关? 在ejb模块中删除primefaces的依赖性并仅在web模块中声明primefaces会更合适吗? (我试过这里,但是web模块可以看到ejb模块,但反过来没有发生,我该怎么做?)

    谢谢大家,对不起我的英语,我是巴西人。

2 个答案:

答案 0 :(得分:1)

您的EJB不应该引用Primefaces并且应该尽可能独立于平台(尽管事实上,没有对Hibernate / EclipseLink的任何依赖关系是不切实际的。)

这是我使用的结构类型:

EAR
  |- (1) WAR
  | \- Primefaces xhtml files etc.
  | |- backing beans (support components in the xhtml files)
  | |- dao beans (handle any interactions with the @Remote facades)
  | |- Dependencies: (2,3)
  |
  |- (2) JAR @Remote interfaces
  | \- Dependencies: (3)
  |
  |- (3) JAR @Entity objects
  | \- Dependencies: (none)
  |
  |- (4) @EJB Module
    \- @Local interfaces
    |- @Local implementations
    |- @Remote implementations
    |- Dependencies: (2,3)

两个关键部分是WAR和EJB模块。这两者都依赖于@Remote和@Entity jar。 他们根本不直接相互依赖。

当ManagedBean与EJB通信时,它通过调用Remote接口来实现,例如@EJB RemoteMyBeanInterface myBean实际上返回EJB模块中的实现(通过魔术)。

尝试分离模块,看看是否对您有所帮助。如果没有,那么安全过滤器可能会有一些干扰(可能是静默的)。你应该开始一个干净的新项目(必要时+新的服务器域);从Primefaces的剪切和粘贴代码开始,然后开始逐个添加所有附加内容和过滤器,直到找到导致问题的原因。

如果您仍然难过,请发布到Primefaces论坛和/或尝试引起BalusC的注意。由于他在这里发布的答案,我的大多数问题都得到了解决。

答案 1 :(得分:0)

我遇到了类似的问题而且我害怕我不记得我是如何修复它的,我很确定通过在web.xml添加以下内容来解决它:

<context-param>
  <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
  <param-value>false</param-value>
</context-param>

和/或

<context-param>
  <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
  <param-value>server</param-value>
</context-param>

我要把我的脖子伸出来说它是第一个代码片段,但它可能会也可能不依赖于设置为服务器的状态保存方法。