【发布时间】:2011-09-22 08:35:21
【问题描述】:
有没有一种方法可以在不引入 servlet api/Wicket 依赖的情况下将 Http/Wicket Session 信息共享到服务层?
我将提供一些背景信息来说明我为什么要问这个问题,以防我遗漏了什么并问错了问题。
我有几个实体具有可以可验证的属性组。 可验证意味着有字段指示验证值、进行验证的用户和验证日期。 这就是这些实体的建模方式:
@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; }
}
当检测到validated 字段发生变化时,ValidationBean 的user 和date 字段会在表示层中自动修改。
所有这些都正常工作。现在,我正在尝试找到一个优雅且通用的解决方案,它与当前建模集成到以下要求:当验证组中的任何属性的值发生变化,并且相关的ValidationBean.validated 没有改变时,@ 987654329@ 和 date 也必须修改为当前用户的 id 和当前日期。
在我看来,有两种选择;将该逻辑放在表示层或业务/服务层中
将它放在表示层将具有效率优势。实体存储在会话中,因此不必再次查询数据库以检查字段更改。但不幸的是,一些实体的一些字段 ajax-updated,很难判断实体是否真的改变了。除了不是表示层满足这一要求的责任。
把它放在服务层似乎是最好的选择,我已经找到了一种可能的方法来正确处理这个问题。我想出了
@PreUpdate。在@Entities 上实现@PreUpdate方法很容易将DB 中的值与即将更新的值进行比较,并相应地修改相关的ValidationBeans。这里的问题,我想这是一个常见的问题,是在业务层,我没有从哪里获取userid。当前用户Id保存在Session中,属于表现层。
因此,欢迎任何关于如何将 http 会话信息共享到服务层(不一定是特定于 Wicket)的提示、cmets、建议,甚至是满足此要求的替代方案。
UDPATE :在gkamal's suggestion 之后,我将尝试以不那么侵入性的方式集成spring-security,只是为了利用SecurityContext。我也很感激关于这个问题的提示。
【问题讨论】:
标签: java hibernate spring wicket