Подчеркивание в выражении OGNL не работает

Я удивлен, что подчеркивание ("_") не работает в OGNL. В приведенном ниже примере все свойства обрабатываются в OGNL/ValueStack, за исключением имени свойства appfull_name из-за подчеркивания.

Пример кода ниже

POJO SampleSdmAppsTabObj.java

import java.io.*;
import javax.persistence.*;


@SuppressWarnings("serial")
@Entity
@Table(name="SDM_APPS")
@IdClass(SdmAppsPkeyObj.class)
public class SdmAppsTabObj implements Serializable 
{
  //@Id
   String                                orgid;
  //@Id
   String                                asnid;
   String                                appfull_name;
   String                                description;

  public SdmAppsTabObj(){}


  public SdmAppsTabObj
  (
    String inOrgId,
    String inAsnId,
    String inAppFullName,
    String inDescription
  )
  {
     this.OrgId = inOrgId;
     this.AsnId = inAsnId;
     this.AppFullName = inAppFullName;
     this.Description = inDescription;
  }
*/

  public String getOrgid()                          { return orgid; }
  public String getAsnid()                          { return asnid; }
  public String getAppfullname()                       { return appfull_name; }
  public String getDescription()                        { return description; }



  public void  setOrgid(String inOrgId )                  { this.orgid = inOrgId; }
  public void  setAsnid(String inAsnId )                  { this.asnid = inAsnId; }
  public void  setAppfullname(String inAppFullName )           { this.appfull_name = inAppFullName; }
  public void  setDescription(String inDescription )             { this.description = inDescription; }

  //Override equals() and hashCode()
  @Override
  public boolean equals(Object inObject)
  {
    if (this == inObject) { return true; }
    if (inObject == null) { return false; }
    if (!(inObject instanceof SdmAppsTabObj)) { return false; }
    SdmAppsTabObj other = (SdmAppsTabObj) inObject;
    if( orgid == null )
    if( other.orgid != null ) { return false; }
    else if( !orgid.equals(other.orgid) ) { return false; }
    if( asnid == null )
    if( other.asnid != null ) { return false; }
    else if( !asnid.equals(other.asnid) ) { return false; }
    return true;
  }
  public int hashCode()
  {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((orgid == null) ? 0 : orgid.hashCode());
    result = prime * result + ((asnid == null) ? 0 : asnid.hashCode());
    return result;
  }
}


SdmAppsAction.java

import SdmAppsTabObj;
import SdmAppsPkeyObj;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class SdmAppsAction extends ActionSupport implements ModelDriven<SdmAppsTabObj>{

  private static final long serialVersionUID = 1L;
  SdmAppsTabObj lSdmAppsTabObj = new SdmAppsTabObj();

    public String execute() throws Exception {

        return SUCCESS;

    }

    public SdmAppsTabObj getModel() {

        return lSdmAppsTabObj;

    }
}


sdm_apps_add.jsp

.....
<h2>Add Apps</h2>
<s:form  action="sdmAppsAction" >
  <s:textfield name="orgid" label="Org" />
  <s:textfield name="asnid" label="Asn" value=""/>
  <s:textfield name="appfull_name" label="App name" value=""/>
  <s:textfield name="description" label="Desc" value=""/>
  <s:submit />
</s:form>

.....


sdm_apps_success.jsp

.....
<h2>Apps Details</h2>
Org : <s:property value="orgid" /><br>
Asn : <s:property value="asnid" /><br>
App name : <s:property value="appfull_name" /><br>
Desc : <s:property value="description" /><br>
.....


person vmnrajesh    schedule 02.04.2011    source источник
comment
Для меня OGNL ведет себя так, как ожидалось. Вы не определили спецификатор открытого доступа для своих свойств, поэтому они не будут напрямую доступны для представления, поэтому OGNL попытается использовать геттер... и, поскольку одного из правильных имен не существует, он потерпит неудачу.   -  person Quaternion    schedule 02.04.2011
comment
Модификатор участника с точки зрения архитектуры не может быть обнародован. Даже я пытался с общественностью, которая не работала. К вашему сведению, я использую стойки 2.2.1 и OGNL 3.0. Поверьте мне, я пробовал все возможные способы с подчеркиванием, создавая хорошие общедоступные имена методов установки/получения, но не добился успеха. Удаление подчеркивания из имени свойства и хорошего имени сеттера/геттера решает всю проблему.   -  person vmnrajesh    schedule 14.04.2011
comment
Если у вас есть в вашем действии: public underscore_test = Hello from underscore!; и в вашем jsp есть значение свойства = underscore_test/> вы увидите Hello from underscore! Я тестировал это с 2.2.1.1, однако не вижу причин, по которым это не сработало бы раньше.   -  person Quaternion    schedule 15.04.2011
comment
Дальнейший ответ RollingBoy следует принять, так как он тоже отлично работает.   -  person Quaternion    schedule 15.04.2011


Ответы (1)


Получатель вашего appfull_name:

public String getAppfullname();

вместо:

public String getAppfull_name();

Кроме того, имя сеттера неверно.

person RollingBoy    schedule 02.04.2011