javabean为啥不能在实体类里写逻辑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javabean为啥不能在实体类里写逻辑相关的知识,希望对你有一定的参考价值。

为什么javabena实体类里只写属性及相应的get set方法,javabean为什么不能在实体类里写逻辑方法,具体解释一下

1、从javabean的设计来看,体现面向对象的封装特点
javabean体现了-封装,bean意思是豆荚,豆荚知道吧,豆荚里面的东西都被封装起来了
2、java语言和现实世界的统一
一个javabean是一个实体,譬如箱子,只有有长宽高,javabean中都给写出来就够了,但是你非要给加上一个其它的逻辑方法,明显不符合现实规律
3、程序易读性
层次分明,通俗易懂。读的人会很轻松。
参考技术A 实体类和javabean类,本质就是java类,没区别。但是,你要把他们区分开来才能得出实体类和javabean类这样的说法。打个比如,坐飞机,都是人去做。但是为了区别,就分出了经济舱和头等舱。这样是为了更好管理。java也是 参考技术B 因为逻辑方法不是写在这一层的,Struts2.0里面把数据库操作写进bean里了 参考技术C 便于开发,如果在一个大型项目里面,分工明确,越细致做起来越快,越方便。可以写的,只是那样看起来冗杂在一起不太好。 参考技术D 因为javabean只是祈祷一个取值和赋值的作用追问

我就是问的为什么javabean只是祈祷一个取值和赋值的作用,为什么不用它写逻辑,他也可以写一些逻辑的

spring security:为啥我们不能在@PreAuthorize 中访问 Hibernate 实体参数?

【中文标题】spring security:为啥我们不能在@PreAuthorize 中访问 Hibernate 实体参数?【英文标题】:spring security : Why can't we access Hibernate entitiy parameters in @PreAuthorize?spring security:为什么我们不能在@PreAuthorize 中访问 Hibernate 实体参数? 【发布时间】:2012-06-01 19:21:40 【问题描述】:

我有以下接口方法,我正在应用@PreAuthorize:

@PreAuthorize("doSomething(#user.id)")
void something(User user, List<User> accessList);

其中User 是一个Hibernate 实体 对象。它给了我一个错误:

org.springframework.expression.spel.SpelEvaluationException: EL1007E:(pos 13): 在 null 处找不到字段或属性“id” org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:204)

user参数不可能为null,好像我删除了注释,并在实现此接口方法的方法中检查用户的值,那里存在一个有效的User对象。另外,在调用这个方法之前,我已经确定了用户对象的构造是正确的。

我真的不明白为什么 SPEL 解析器会认为 user 字段为空

【问题讨论】:

【参考方案1】:

您可以使用调试器检查 MethodSecurityEvaluationContext 中发生了什么,在 Object lookupVariable(String name) 方法中:

    @Override
    public Object lookupVariable(String name) 
    Object variable = super.lookupVariable(name);

    if (variable != null) 
        return variable;
    

    if (!argumentsAdded) 
        addArgumentsAsVariables();
        argumentsAdded = true;
    

因此您可以看到 addArgumentsAsVariables() 方法中真正发生的事情,因为在 Spring 中非常清楚地实现了方法参数到 SPEL 变量的转换。

【讨论】:

谢谢你。事实证明,我在接口声明中的方法参数中的变量名与我实际实现的方法中的名称不同...... Spring 正在寻找后者名称【参考方案2】:

Spring Security 现在对这个问题有了更好的答案:

http://docs.spring.io/spring-security/site/docs/3.2.5.RELEASE/reference/htmlsingle/#access-control-using-preauthorize-and-postauthorize

如果你使用

【讨论】:

谢谢,在方法签名中添加 @Param 注释对我有用。【参考方案3】:

您可以查看LazyParamAwareEvaluationContext,在loadArgsAsVariables() 方法中,版本3.1.0。

不同Entity的key相同,因为实现了接口。

【讨论】:

【参考方案4】:

我需要为此添加一些内容,因为标题表明我们无法访问休眠属性。

hasPermission 有两个版本,加载对象和序列化对象。以下是来自测试用例的一些代码:

@PreAuthorize("isAuthenticated() and hasPermission(#organization, 'edit')")
public long protectedMethod(Organization organization)

    return organization.getId();

对于后者,我们看到我们实际上可以访问组织的 id 属性(这是一个休眠实体):

@PreAuthorize("isAuthenticated() and hasPermission(#organization.getId(), 'organization', 'edit')")
public long protectedMethodSerializableEdtion(Organization organization)

    return organization.getId();

【讨论】:

以上是关于javabean为啥不能在实体类里写逻辑的主要内容,如果未能解决你的问题,请参考以下文章

javabean 实体类的转换

如何获得实体类里属性本身?

javabean和实体类的区别?

Java中 entity层(model层)是实体类层 biz层是干啥的?感觉也像是个实体类

java实体类为啥要实现serlializable接口

JavaBean实体类详解