管理系统基于Oracle数据库,springmvc、spring、Mybatis框架和springSecurity框架
😶
问题一
查询的目的是,根据订单id查出此订单的产品信息、会员信息和游客信息。
出现的问题是,我的sql语句在PL/SQL developer中能正确查到某个订单的所有要求的信息,但放到xml中,能查出游客信息,但只有一条游客信息(正确应该有两条),而且如果订单的游客不是会员就无法查到该游客。
select o.*,m.*,t.*,p.*
from traveller t,orders o,member m,product p
where o.id = 'C445416F31424381BC401D5BCC433DDD'
and m.id = (select m.id from member m,orders o where o.memberid = m.id and o.id = 'C445416F31424381BC401D5BCC433DDD')
and t.id in (select t.id from traveller t,order_traveller ot where t.id = ot.travellerid and ot.orderid = 'C445416F31424381BC401D5BCC433DDD')
and p.id = (select p.id from product p,orders o where o.productid = p.id and o.id = 'C445416F31424381BC401D5BCC433DDD')
sql语句放到PL/SQL developer中能正确的查到两条游客记录
<select id="findById" resultMap="ordersDetails" parameterType="String">
select o.*,m.*,t.*,p.*
from traveller t,orders o,member m,product p
where o.id = #{id}
and m.id = (select m.id from member m,orders o where o.memberid = m.id and o.id = #{id})
and t.id in (select t.id from traveller t,order_traveller ot where t.id = ot.travellerid and ot.orderid = #{id})
and p.id = (select p.id from product p,orders o where o.productid = p.id and o.id = #{id})
</select>
但在项目里只能查到德莱厄斯这个会员作为游客的信息。怎么改都是直接用给sql语句能查到记录,在xml中就是查不到正确的信息,最后只能妥协用注解方式的sql。
@Select("select * from orders where id=#{ordersId,jdbcType=VARCHAR}")
@Results({
@Result(id = true, property = "id", column = "id"),
@Result(property = "orderNum", column = "orderNum"),
@Result(property = "orderTime", column = "orderTime"),
@Result(property = "orderStatus", column = "orderStatus"),
@Result(property = "peopleCount", column = "peopleCount"),
@Result(property = "peopleCount", column = "peopleCount"),
@Result(property = "payType", column = "payType"),
@Result(property = "orderDesc", column = "orderDesc"),
@Result(property = "product", column = "productId", javaType = Product.class, one = @One(fetchType = FetchType.LAZY,select = "com.example.dao.ProductDao.findById")),
@Result(property = "member",column = "memberId",javaType = Member.class,one = @One(fetchType = FetchType.LAZY,select = "com.example.dao.MemberDao.findById")),
@Result(property = "travellers",column = "id",javaType =java.util.List.class,many = @Many(fetchType = FetchType.LAZY,select = "com.example.dao.TravellerDao.findByOId"))
})
Orders findById(String id);
注解的方式,方便理解,而且好像查询的语句也比较清晰。
问题二
这里先说一下方法级权限的三种配置方式
方式一
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>
2、在spring-mvc.xml 开启注解
<security:global-method-security jsr250-annotations="enabled"></security:global-method-security>
3、在权限控制的方法上面使用注解
@RolesAllowed("ADMIN")
这种也可以写@RolesAllowed("ROLE_ADMIN"),上面是省略ROLE_前缀
方式二
1、在spring-mvc.xml 开启注解
<security:global-method-security secured-annotations="enabled"></security:global-method-security>
2、在权限控制的方法上面使用注解
@Secured("ROLE_ADMIN")
这里不能省略ROLE_前缀
方式三,支持表达式
1、在spring-mvc.xml 开启注解
<security:global-method-security pre-post-annotations="enabled"></security:global-method-security>
2、在权限控制的方法上面使用注解
@PreAuthorize("authentication.principal.username == 'peny'")
@PreAuthorize("hasRole('ROLE_ADMIN')")
这里可以省略ROLE_前缀; @PreAuthorize("hasRole('ADMIN')")
在用springsecurity做方法级的权限管理时,配置出了问题,想用方式二,因为它就是spirngsecurity框架自带的,不用再导包,但本来是在spring-security.xml这里配置的标签,怎么配置都没有效果。
最后百度的要放在springMVC的配置文件里,
spring-security 开启方法级权限控制失败
<!--方法级的权限控制-->
<security:global-method-security jsr250-annotations="enabled" secured-annotations="enabled"/>
悲催的是这样配置之后启动tomcat运行报错,Unexpected AOP exception; nested exception is java.lang.IllegalStateException,我去,真的是面向百度编程啊,然后 死马当活马医 ,按照Unexpected AOP exception; nested exception is java.lang.IllegalStateException: 解决,解决了。。。
终于,方法级的权限控制生效了。😥
问题三
关于AOP配置的问题,需要开启AOP的注解支持
本来在spring框架中,AOP的配置都和spring容器配置写在一起,都在applicationContext.xml中,但配置之后没有效果,然后又在CSDN上查到要配置在springMVC的配置文件中,试了一下,果然生效了,😶
<!--
支持AOP的注解支持,AOP底层使用代理技术
JDK动态代理,要求必须有接口
cglib代理,生成子类对象,proxy-target-class="true" 默认使用cglib的方式
-->
<aop:aspectj-autoproxy proxy-target-class="true"/>
这个管理系统用到了十一个表,是我用数据库的历史之最多,构建项目用到了IDEA的Module这种方式,每一层是一个module,而且这个还用了一些maven的命令,确实由maven管理项目真的不错。
这三个问题都是基于实际做项目产生的,我没法单独做测试,除非花大力气大量修改、抽取然后写测试类,当然还不能保证测试一定能有什么明确的结果,所以还是百度的多一点。