Есть ли способ, которым я могу поделиться информацией Http / Wicket Session на сервисном уровне без введения зависимости сервлет API / Wicket?
Я предоставлю некоторый контекст, почему я задаю этот вопрос, на случай, если я что-то упустил и задаю неправильный вопрос.
У меня есть несколько сущностей, которые имеют группы атрибутов, которые могут быть валидными .
Значение validatable означает, что есть поля, указывающие значение проверки, пользователя, который сделал проверку, и дату, в которой она была проверена.
Вот как моделируются эти объекты:
@Embeddable
public class ValidationBean<T> implements Serializable {
private T validated;
private String user;
private Date date;
// Constructors, getters, setters ahead.
// ...
}
@Entity
@Table(name="SOME_TABLE")
public class SomeEntity implements Serializable, SomeInterface {
// Some attributes which conform validation group 1
public String attribute11;
public String attribute12;
public String attribute13;
private ValidationBean<Integer> validationBean1 = new ValidationBean<Integer>();
// Some attributes which conform validation group 2
public String attribute21;
private ValidationBean<String> validationBean2 = new ValidationBean<Integer>();
// Constructors, various attribute getters with JPA annotations
// ...
@Embedded
@AttributeOverrides(/*various overrides, each entity/validation group has its own validation column names...*/)
public ValidationBean<Integer> getValidationBean1() { return validationBean1; }
@Embedded
@AttributeOverrides(/*various overrides, each entity/validation group has its own validation column names...*/)
public ValidationBean<Integer> getValidationBean2() { return validationBean2; }
}
Поля
ValidationBean
user
и date
автоматически изменяются на уровне представления при обнаружении изменения в поле validated
.
Все это работает правильно. Теперь я пытаюсь найти элегантное и общее решение, которое интегрируется с текущим моделированием в соответствии со следующим требованием: когда какой-либо из атрибутов в группе проверки получает свое значение, а связанный ValidationBean.validated
не изменяется, user
и date
также должны быть изменены с идентификатором текущего пользователя и текущей датой.
На мой взгляд, есть две альтернативы; размещение этой логики на уровне представления или на уровне бизнеса / услуг
Размещение его на уровне представления будет иметь преимущество в эффективности. Объекты хранятся в сеансе, поэтому нет необходимости запрашивать БД для проверки изменений полей. Но, к сожалению, некоторые сущности имеют некоторые из своих полей ajax-updated, и было бы трудно сказать, действительно ли сущность изменилась. Помимо того, что уровень представления ответственности не отвечает этим требованиям.
Размещение его в слое обслуживания кажется наилучшей альтернативой, и я уже нашел возможный способ справиться с этим должным образом. Я придумал @PreUpdate
. Было бы легко реализовать метод @PreUpdate
в @Entities, чтобы сравнить значения в БД со значениями, которые будут обновлены, и соответствующим образом изменить связанный ValidationBeans
. Проблема здесь, и я предполагаю, что это распространенная проблема, заключается в том, что на бизнес-уровне у меня нет места, где можно получить идентификатор user
. Текущий идентификатор пользователя хранится в сеансе, который принадлежит уровню представления.
Итак, любые советы, комментарии, рекомендации о том, как я могу поделиться информацией о сеансе http на уровне обслуживания (не обязательно для Wicket), или даже альтернативы для выполнения этого требования.
UDPATE : Следуя предложению gkamal , я постараюсь интегрировать Spring-безопасность как можно менее навязчивым способом, просто чтобы воспользоваться преимуществами SecurityContext. Буду также признателен за советы по этому вопросу.