ActiveWeb: установка / получение модели не работает при вызове в шаблоне - PullRequest
0 голосов
/ 24 сентября 2018

При работе с устаревшей базой данных бывают случаи, когда я не могу правильно настроить отношения с помощью аннотации belongs_to.В этом случае я попытался определить атрибут, указывающий на другой класс Model, с его методами доступа следующим образом:

@Table("INTERVENTION")
@IdName("ITV_ID")
public class Intervention extends Model {
  private InterventionModel interventionModel;

    public InterventionModel getInterventionModel() {
        return interventionModel;
    }

    public void setInterventionModel(InterventionModel interventionModel) {
        this.interventionModel = interventionModel;
    }
}

Я загружаю и устанавливаю InterventionModel в классе обслуживания без проблем следующим образом(intervention экземпляр существует):

private void loadInterventionModel(final Intervention intervention) {
        final InterventionModel model = InterventionModel.findById(intervention.getLongId());
        intervention.setInterventionModel(model);
    }

Проблема в том, что он не работает, когда я пытаюсь оценить InterventionModel атрибуты в шаблоне FreeMarker:

"item_code:": ${intervention.intervention_model.imo_internal_code}

Вотсброшенная ошибка:

FreeMarker template error:
An error has occurred when reading existing sub-variable "intervention_model"; see cause exception! The type of the containing value was: extended_hash+string (app.models.Intervention wrapped into f.e.b.StringModel)

Caused by: java.lang.IllegalArgumentException: Attribute: 'intervention_model' is not defined in model: 'class app.models.Intervention.

Чего мне здесь не хватает и почему она не работает должным образом?Как правило, если я объявлю атрибут в модели с его аксессорами (getter и setter), он будет доступен в шаблоне с помощью:

mymodel.my_attribute

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Если ваш класс InterventionModel указывает на устаревшую таблицу, вы можете сделать это:

@Table("INTERVENTION")
@IdName("ITV_ID")
public class Intervention extends Model {
  private InterventionModel interventionModel;

    public InterventionModel getInterventionModel() {
        return interventionModel;
    }

    public void setInterventionModel(InterventionModel interventionModel) {
        this.interventionModel = interventionModel;
    }

    Object getImoProductLabel(){
        return interventionModel.imo_product_label();
    }
}

, а затем в шаблоне:

"label": "${intervention.imoProductLabel}"

, таким образом, вы создадитеметод не только для шаблона, но и для других мест в коде и абстрагирование вашего старого кода.

0 голосов
/ 24 сентября 2018

Я думаю, я нашел причину.Кажется, что когда вы объявляете переменную экземпляра в модели класса, и эта переменная не относится к доступным атрибутам модели (столбцы таблицы), вы должны использовать snake_case вместо camelCase записи, т.е. вместо объявления:

public class Intervention extends Model {
...
  private InterventionModel interventionModel;

  public InterventionModel getInterventionModel() {
        return interventionModel;
    }

    public void setInterventionModel(InterventionModel interventionModel) {
        this.interventionModel = interventionModel;
    }

}

используйте версию snake_case:

private InterventionModel intervention_model;

public InterventionModel getIntervention_model() {
    return intervention_model;
}

public void setIntervention_model(InterventionModel intervention_model) {
    this.intervention_model = intervention_model;
}

Таким образом, вы сможете получить к нему доступ в шаблоне, как и другие переменные, доступные в модели:

"label": "${intervention.intervention_model.imo_product_label}"

ВВ начале я считал, что преобразование было сделано автоматически.Вы можете оставить camlCase verion, - в этом случае вы должны использовать его и в своем шаблоне:

"label": "${intervention.interventionModel.imo_product_label}"

Надеюсь, это поможет.

...