EL и ковариантные возвращаемые типы

у меня есть эти классы

public abstract class Unit
{
    public abstract UnitType getType();

    ...
}

public class Item extends Unit
{
    protected ItemType type;

    @Override
    public ItemType getType()
    {
        return type;
    }

    public void setType(ItemType type)
    {
        this.type = type;
    }

    ...
}

и, очевидно, ItemType расширяет UnitType.

и я получаю:

javax.el.PropertyNotWritableException: /WEB-INF/facelets/general.xhtml @23,165 value="#{bean.item.type}": The class 'com.example.Item' does not have a writable property 'type'.

я понимаю, что ковариантный возвращаемый тип может сбить с толку EL (2.2), так что это ошибка?

я могу обойти это, используя

  1. дженерики
  2. измените подпись setType на public void setType(UnitType type) и проверьте instanceof внутри
  3. изменить имя метода, чтобы избежать переопределения

есть ли РЕАЛЬНОЕ решение вместо обходных путей?


person Michele Mariotti    schedule 16.04.2013    source источник


Ответы (1)


Похоже, виноват java.beans.Introspector. В Java было много соответствующих ошибок: 7092744, 7122138, 6528714, 6794807, 6788525. Проблемы проявляются с ковариантными возвращаемыми типами и обобщениями из-за методов синтетического моста. С некоторыми обновлениями Java 7 (45, 51, 67, 71) проблемы проявляются не сразу, а после запуска сервера в течение некоторого времени - это, вероятно, связано с мягкими/слабыми ссылками на кэши в Introspector и связанных с ним классах.

Все эти проблемы, по-видимому, исправлены в Java 1.7.0_80 (протестировано с Mojarra 2.2.8 и Wildfly 8.2.0.Final).

person Vsevolod Golovanov    schedule 28.04.2015