有没有一种方法可以在不引入servlet api / Wicket依赖关系的情况下将Http / Wicket会话信息共享到服务层?
我将提供一些背景信息,说明我为什么要提出这个问题,以防万一我遗漏了一些东西并提出了错误的问题。
我有几个实体,它们具有可以验证的属性组。作为可验证的方式有指示验证值,谁做了验证,并在验证日期用户领域这是这些实体建模方式:
@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
必须使用当前用户的ID和当前日期进行修改。
在我看来,有两种选择。将逻辑放在表示层或业务/服务层
将其放在表示层中将具有效率上的优势。实体存储在会话中,因此不必再次查询DB来检查字段更改。但是不幸的是,某些实体的某些字段已用ajax更新,因此很难判断该实体是否真的发生了变化。除了不是表示层要满足此要求的责任外。
将其放在服务层中似乎是最好的选择,而且我已经找到了一种正确处理此问题的方法。我想出了@PreUpdate
。@PreUpdate
在@Entities上实现一种方法来比较DB中的值与即将更新的值,并相应地修改相关值,这很容易ValidationBeans
。我想这是一个普遍的问题,是在业务层,我没有从哪里获取user
ID的问题。当前用户ID存储在属于表示层的Session中。
因此,将欢迎有关如何与服务层共享http会话信息的任何提示,评论,建议(不一定是特定于Wicket的),甚至可以选择满足此要求的替代方法。
UDPATE:按照gkamal的建议,我将尝试以一种较不侵入的方式集成spring-security,以利用SecurityContext。我也很感谢有关此事的提示。
解决此问题的常用方法是引入一个SecurityContext类,该类将当前用户的详细信息保存为静态线程局部变量。该变量由安全过滤器或其他过滤器初始化(来自httpsession),并在请求处理完成后清除。SecurityContext类本身将成为提供set / get方法的业务层的一部分,因此不具有任何Web层依赖性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句