Проблема привязки свойства bean к элементу в JSF - PullRequest
3 голосов
/ 14 февраля 2011

У меня есть вход (JSF), который должен быть привязан к свойству в моем бине.Это свойство представляет другой компонент и имеет вспомогательный метод, который проверяет, является ли он пустым (я часто использую этот метод).

Проблема заключается в том, что привязке не удается получить надлежащие методы получения и установки.Вместо чтения метода, возвращающего компонент, он читает метод, возвращающий логическое значение.

Имя свойства: guest .Методы:

  • getGuest;
  • setGuest;
  • isGuest (проверяет, является ли гость нулевым).

JSF пытаетсяпривязать объект к isGuest и setGuest вместо getGuest и setGuest .

Я не могу переименовать isGuest до guestIsNull или что-то еще, потому что это не имеет большого смысла (см. класс ниже).

Наконец, мой вопрос: как я могупривязать это свойство к объекту без переименования моих методов?Возможно ли это?

Я также принимаю предложения относительно лучшего названия метода (но значение должно быть таким же).


Сущность

@Entity
public class Passenger {

    private Employee employee;
    private Guest guest;

    public Passenger() {
    }

    @Transient
    public boolean isEmployee() {
        return null != this.employee;
    }

    @Transient
    public boolean isGuest() {
        return null != this.guest;
    }

    @OneToOne
    public Employee getEmployee() {
        return this.employee;
    }

    public void setEmployee(Employee employee) {
        this.employee = employee;
    }

    @OneToOne
    public Guest getGuest() {
        return this.guest;
    }

    public void setGuest(Guest guest) {
        this.guest = guest;
    }

}

JSF

<h:inputText value="#{passenger.employee}" />
<h:inputText value="#{passenger.guest}" />

Ответы [ 3 ]

4 голосов
/ 14 февраля 2011

Измените имя метода на isGuestNull.

Проблема, которую вы видите, связана с тем, что EL позволяет вам использовать getFoo или isFoo в качестве стиля именования для методов получения, возвращающих логические значения.

2 голосов
/ 14 февраля 2011

Нет, это невозможно.Вы должны переименовать их.

Другой способ - добавить один получатель, возвращающий перечисление, охватывающее все случаи.

public enum Type {
    GUEST, EMPLOYEE;
}

public Type getType() {
    return guest != null ? Type.GUEST
         : employee != null ? Type.EMPLOYEE
         : null;
}

с

<h:something rendered="#{passenger.type == 'GUEST'}">
1 голос
/ 15 февраля 2011

Привязка к любому свойству любым способом возможна и довольно проста, если вы создаете свой собственный ELResolver ( apidocs ). elresolvers зарегистрированы в лицах конфигурации, и они отвечают, учитывая Object и String, определяющие свойство, для определения значения и типа данных свойств (и, по мере необходимости, для его изменения).

Вы можете легко написать свой собственный ELResolver, который будет работать только для выбранного вами типа, и использовать (например, в операторе switch) конкретные методы, которые вам нужны для записи и чтения свойств. И для других типов это делегировало бы разрешение цепочки распознавателя. Это действительно легко сделать, гораздо проще, чем кажется.

Но не делай этого. Стандартная схема именования свойств предшествует EL на многие годы. Он является частью стандарта JavaBeans ™ - одного из немногих бесспорных стандартов в Javaland, работающих везде - от ant-скриптов, весенних конфигурационных файлов до JSF. Видение методов isPerson и getPerson в одном классе на самом деле заставляет меня чувствовать себя неловко, так как это ломает то, что я всегда воспринимаю как должное и всегда могу рассчитывать.

Если вам нравится DDD и вы хотите иметь чистые имена методов, используйте адаптер. Это легко, весело и дает пару дополнительных строк, на которые не стоит насмехаться, если вам платят за количество произведенного кода:

public class MyNotReallyBean {

  public String checkName() { ... }
  public String lookUpLastName() { ... }
  public String carefullyAskAboutAge() { ... }

  public class BeanAdapter {
     public String getName() { return checkName(); }
     public String getLastName() { return lookUpLastName(); }
     public String getAge() { return carefullyAskAboutAge(); }
  }
  private static BeanAdapter beanAdapter = new BeanAdapter();

  private BeanAdapter getBeanAdapter(){ return beanAdapter; }

}
...