использование интерфейсов с методами по умолчанию в Beans, Facelets, Java 8 - PullRequest
0 голосов
/ 26 октября 2018

У меня есть родительский класс

public class ParentBean {

    @ManagedProperty(value = "#{bundle}")
    private ResourceBundleBean bundle;

    public ResourceBundleBean getBundle() {
        return bundle;
    }

    public void setBundle(ResourceBundleBean bundle) {
        this.bundle = bundle;
    }

}

Теперь у меня есть Bean

@ManagedBean(name = "servicio")
@ViewScoped
public class ServicioBean extends ParentBean  {
    private Boolean cumple;

    public Boolean getCumple() {
        return cumple;
    }

    public void setCumple(Boolean cumple) {
        this.cumple = cumple;
    }
}

В соответствии с включением новых функций одна альтернатива - это добавление свойств и их методов в родительский класс.

public class ParentBean {

    @ManagedProperty(value = "#{bundle}")
    private ResourceBundleBean bundle;

    public ResourceBundleBean getBundle() {
        return bundle;
    }

    public void setBundle(ResourceBundleBean bundle) {
        this.bundle = bundle;
    }

    private final Map<String,String> listaSiNo = new HashMap<String, String>() {{
        put("S", "Sí");
        put("N", "No");
    }};

    public Map<String,String> getListaSiNo() {
        return listaSiNo;
    }

}

Он отлично работает в моем фейс-листе (с наследованием).

<p:outputLabel value="Cumple?:" for="itCumple" />
<p:selectOneMenu id="itCumple" value="#{servicio.cumple}" >
    <f:selectItems value="#{servicio.listaSiNo.entrySet()}" var="entry"
                   itemValue="#{entry.key}" itemLabel="#{entry.value}" />
</p:selectOneMenu>

Чтение этой статьи: https://www.baeldung.com/java-static-default-methods

Но я хочуиспользовать метод интерфейса Почему ?.Поскольку у меня есть несколько Бинов, и я не хочу влиять на все Бины.

public interface ListasForBeans {

    default Map<String,String> getListaSiNo() {
        Map<String,String> listaSiNo = new HashMap<String, String>() {{
            put("S", "Sí");
            put("N", "No");
        }};
        return listaSiNo;
    }

}

Я хочу вставить в выбранные Бины только оператор implements ListasForBeans.(не более getter и setter о внутренних свойствах в интерфейсе, в затронутых bean-компонентах) ...

@ManagedBean(name = "servicio")
@ViewScoped
public class ServicioBean extends ParentBean implements ListasForBeans {
    private Boolean cumple;

    public Boolean getCumple() {
        return cumple;
    }

    public void setCumple(Boolean cumple) {
        this.cumple = cumple;
    }
}

У меня есть эта ошибка:

javax.servlet.ServletException: The class 'ServicioBean' 
does not have the property 'listaSiNo'.

Isэто возможно?

Как это сделать?

...