Xav*_*ica 5 java spring wicket hibernate
有没有办法在不引入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; }
}
Run Code Online (Sandbox Code Playgroud)
ValidationBean的user和date字段中的改变时被自动在表示层改性validated检测字段.
所有这一切都正常.现在,我正在尝试找到一个优雅的通用解决方案,它将当前建模与以下要求集成:当验证组中的任何属性更改其值时,相关性ValidationBean.validated不会更改,user并且date还必须是使用当前用户的ID和当前日期进行修改.
我认为,有两种选择; 将该逻辑放在表示层或业务/服务层中
将它放在表示层中将具有效率优势.实体存储在会话中,因此不必再次查询数据库以检查字段更改.但遗憾的是,一些实体的某些字段已经更新了ajax,并且很难判断该实体是否真的发生了变化.除了不是表示层对满足此要求的责任.
将它放在服务层似乎是最好的选择,我已经找到了一种可能的方法来正确处理它.我想出来了@PreUpdate.@PreUpdate在@Entities上实现一个方法可以很容易地将DB中的值与要更新的值进行比较,并相应地修改相关值ValidationBeans.这里的问题,我认为这是一个常见的问题,就是在业务层,我没有从哪里获取userid.当前用户Id存储在Session中,该Session属于表示层.
因此,任何有关如何将http会话信息共享到服务层(不一定是特定于Wicket)的提示,评论和建议,或者甚至是满足此要求的替代方案都将受到欢迎.
UDPATE:遵循gkamal的建议,我将尝试以尽可能不那么干扰的方式集成spring-security,只是为了利用SecurityContext.我也很欣赏这个问题的提示.
用于解决此问题的常用方法是引入一个SecurityContext类,该类将当前用户的详细信息保存为静态线程局部变量.该变量由安全过滤器或其他过滤器初始化(来自httpsession),并在请求处理完成后清除.SecurityContext类本身就是业务层的一部分,它提供了set/get方法,因此没有任何Web层依赖性.
| 归档时间: |
|
| 查看次数: |
3123 次 |
| 最近记录: |