以下是定义切面之前的主要代码,运行是成功的:
applicationContext.xml:
<bean id="menuAction" class="com.infoCmu.login.action.MenuAction">
<property name="userServer" ref="userServer"></property>
</bean>
java:
public class MenuAction extends ActionSupport {
private UserServer userServer;
public void setUserServer(UserServer userServer){
this.userServer = userServer;
}
public String execute(){
User userobj1 = new User();
userobj1.setUserid("aaa"+(int)Math.floor(Math.random()*1000));
userobj1.setPwd("pwd");
try{
userServer.setUserinfo(userobj1);
}catch(Exception e){
e.printStackTrace();
}
}
这个时候通过debug可以看到,userServer是获得对象的。
然后在applicationContext.xml加入了如下切面:
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="execute" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* *..Action.execute())"/>
</aop:config>
这个时候再debug,上面的userServer就是null了。
最近在学习搭框架,所以程序的层次并不严谨,上面这些是在尝试做数据库事务处理时发生的。下一楼我会尽量贴出全部代码。
29 个解决方案
#1
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="execute" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* *..Action.execute())"/>
</aop:config>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/infocum"></property>
<property name="username" value="root"></property>
<property name="password" value=""></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mappingResources">
<list>
<value>com/infoCmu/domain/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.autoReconnect">true</prop>
</props>
</property>
</bean>
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="userServer" class="com.infoCmu.servers.UserServer">
<property name="hibernateTemplate" ref="hibernateTemplate"></property>
</bean>
<bean id="menuAction" class="com.infoCmu.login.action.MenuAction">
<property name="userServer" ref="userServer"></property>
</bean>
</beans>
java:
public class MenuAction extends ActionSupport {
private UserServer userServer;
public void setUserServer(UserServer userServer){
this.userServer = userServer;
}
public String execute(){
// db链接实验
User userobj1 = new User();
userobj1.setUserid("aaa"+(int)Math.floor(Math.random()*1000));
userobj1.setPwd("pwd");
try{
userServer.setUserinfo(userobj1);
}catch(Exception e){
e.printStackTrace();
}
return "success";
}
}
public class UserServer{
public void setUserinfo(User user){
try{
hibernateTemplate.save(user);
}catch(Exception e){
System.out.println(e.getStackTrace());
}
}
HibernateTemplate hibernateTemplate;
public void setHibernateTemplate(HibernateTemplate hibernateTemplate){
this.hibernateTemplate = hibernateTemplate;
}
}
以下是hibernateTool自动生成的mapping代码
package com.infoCmu.obj;
/**
* User generated by hbm2java
*/
public class User implements java.io.Serializable {
private String userid;
private String pwd;
public User() {
}
public User(String userid, String pwd) {
this.userid = userid;
this.pwd = pwd;
}
public String getUserid() {
return this.userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getPwd() {
return this.pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
User.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2013-5-19 18:00:46 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.infoCmu.obj.User" table="user" catalog="infocmu">
<id name="userid" type="string">
<column name="userid" length="20" />
<generator class="assigned" />
</id>
<property name="pwd" type="string">
<column name="pwd" length="20" not-null="true" />
</property>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="execute" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* *..Action.execute())"/>
</aop:config>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/infocum"></property>
<property name="username" value="root"></property>
<property name="password" value=""></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mappingResources">
<list>
<value>com/infoCmu/domain/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.autoReconnect">true</prop>
</props>
</property>
</bean>
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="userServer" class="com.infoCmu.servers.UserServer">
<property name="hibernateTemplate" ref="hibernateTemplate"></property>
</bean>
<bean id="menuAction" class="com.infoCmu.login.action.MenuAction">
<property name="userServer" ref="userServer"></property>
</bean>
</beans>
java:
public class MenuAction extends ActionSupport {
private UserServer userServer;
public void setUserServer(UserServer userServer){
this.userServer = userServer;
}
public String execute(){
// db链接实验
User userobj1 = new User();
userobj1.setUserid("aaa"+(int)Math.floor(Math.random()*1000));
userobj1.setPwd("pwd");
try{
userServer.setUserinfo(userobj1);
}catch(Exception e){
e.printStackTrace();
}
return "success";
}
}
public class UserServer{
public void setUserinfo(User user){
try{
hibernateTemplate.save(user);
}catch(Exception e){
System.out.println(e.getStackTrace());
}
}
HibernateTemplate hibernateTemplate;
public void setHibernateTemplate(HibernateTemplate hibernateTemplate){
this.hibernateTemplate = hibernateTemplate;
}
}
以下是hibernateTool自动生成的mapping代码
package com.infoCmu.obj;
/**
* User generated by hbm2java
*/
public class User implements java.io.Serializable {
private String userid;
private String pwd;
public User() {
}
public User(String userid, String pwd) {
this.userid = userid;
this.pwd = pwd;
}
public String getUserid() {
return this.userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getPwd() {
return this.pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
User.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2013-5-19 18:00:46 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.infoCmu.obj.User" table="user" catalog="infocmu">
<id name="userid" type="string">
<column name="userid" length="20" />
<generator class="assigned" />
</id>
<property name="pwd" type="string">
<column name="pwd" length="20" not-null="true" />
</property>
</class>
</hibernate-mapping>
#2
你的 切面 没有注入 数据源 或 都说是 sessionFactory
<bean id="transactionManager" class="这里是Hibernate的transactionManager工厂类 (至于怎么写我网忘了 好久没用了)">
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<bean id="transactionManager" class="这里是Hibernate的transactionManager工厂类 (至于怎么写我网忘了 好久没用了)">
<tx:advice id="txAdvice" transaction-manager="transactionManager">
#3
二楼的朋友,你的意思是我下面的配置不对是么?
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
#4
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="execute" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
少了个属性吧
#5
<tx:advice id="txAdvice"
transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="execute" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<tx:attributes>
<tx:method name="execute" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
#6
4(5)楼的朋友,谢谢你的回答。
但是transaction-manager的默认值就是"transactionManager",所以不用特别设定。
但是transaction-manager的默认值就是"transactionManager",所以不用特别设定。
#7
本人追加分数到100分,向各位大神求解。
这个事情已经折腾我2天了,拜托了。
这个事情已经折腾我2天了,拜托了。
#8
<aop:config>加上如下属性,试试:
<aop:config proxy-target-class="true">
#9
值栈中userserver为null说明,userserver没注入进去啊。看看你的spring和struts2是否正确整合,另外在你的代码中, <class name="com.infoCmu.obj.User" table="user" catalog="
infocmu">
和<property name="url" value="jdbc:mysql://localhost:3306/ infocum"></property>两个数据库的名字不一样。关键是你的spring和你的struts2是否整合正确啊
和<property name="url" value="jdbc:mysql://localhost:3306/ infocum"></property>两个数据库的名字不一样。关键是你的spring和你的struts2是否整合正确啊
#10
到我的博客下载那个开源项目看看,
基于spring整合的,里面有事务可以参考下做法
基于spring整合的,里面有事务可以参考下做法
#11
一看就是execution(* *..Action.execute())这个有问题。
#12
只要不加事务处理的切面,程序就是可以的。另外感谢你仔细看了我的程序,才能发现infocum这种细微的地方。我数据库的名字起错了,但是因为是练习,所以懒得改了。改完之后,还是不行,一样的问题。
#13
切点的声明我确实有点迷糊。能不能详细点,最好根据我现在的程序,帮我写一下声明?多谢。
#14
改为"execution(*
com.infoCmu.Action.*.*(..))"
根据你具体包名写
根据你具体包名写
#15
加上这个属性启动就报错了。所以应该不是这个的问题。
Caused by: org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.
#16
确实有可能是切点的声明错误导致其后无法注入,Action应该无法代表MenuAction,这个查一下就知道了
即使先暂时换成MenuAction用来测试
#17
execution(* com.accp.biz.impl.*(这个*代表你的类).*(这个*代表你类中的方法)(..(括号中的两点代表你方法中的参数)))
#18
加上这个属性启动就报错了。所以应该不是这个的问题。
Caused by: org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.
没必要强制aop使用cglib代理,jdk动态代理没有报出错误
#19
改为"execution(* com.infoCmu.Action.*.*(..))"
根据你具体包名写
已经改成如下内容,还是一样的:
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* com.infoCmu.login.action.MenuAction.execute())"/>
</aop:config>
#20
4(5)楼的朋友,谢谢你的回答。
但是transaction-manager的默认值就是"transactionManager",所以不用特别设定。
这个还不知道呢,学习了
#21
execution(* com.infoCmu.login.action.MenuAction.execute(
..))是不是少了2点啊
#22
还是好好看看aop里面的几个概念再写配置吧
#23
谢谢各位的回复,我现在将事务处理定位在了server,经提示加入了cglib等包之后,在server层形成了事务。
我想也许是因为struts对action有限制所以无法设定切点吧。但我更期望能在action层形成事务,这个问题我回头再找找资料,如果大家还有好的想法,请继续回复。
我下午再研究下,晚上或者明天来结贴。再次感谢!
我想也许是因为struts对action有限制所以无法设定切点吧。但我更期望能在action层形成事务,这个问题我回头再找找资料,如果大家还有好的想法,请继续回复。
我下午再研究下,晚上或者明天来结贴。再次感谢!
#24
<aop:config>加上如下属性,试试:
<aop:config proxy-target-class="true">
果然是这个原因呢,加上这句话,事务处理切面就可以正常处理了,谢谢。
之前报错是因为缺少包,我以为是设定有问题,不好意思,但是切面如果定在server就不用这句话,下午再研究下。
#25
百度上查了很久,也没有找到action必须使用cglib代理,否则无法注入的问题呢,有没有哪位大神能够解释一下?
#26
百度上查了很久,也没有找到action必须使用cglib代理,否则无法注入的问题呢,有没有哪位大神能够解释一下?
使用jdk动态代理的前提是受代理目标对象至少要实现一个接口,如果没有实现任何接口,就得用cglib了
#27
百度上查了很久,也没有找到action必须使用cglib代理,否则无法注入的问题呢,有没有哪位大神能够解释一下?
使用jdk动态代理的前提是受代理目标对象至少要实现一个接口,如果没有实现任何接口,就得用cglib了
那为什么一定要在切面里加入<aop:config proxy-target-class="true">呢?我还实验了一下,加入了序列化的借口serialize,但是也不行。
#28
那为什么一定要在切面里加入<aop:config proxy-target-class="true">呢?我还实验了一下,加入了序列化的借口serialize,但是也不行。
这个配置就是指示使用cglib。
Serializable接口这个倒特别提及,
我查到是这么实现的,假设 SimplePojo implements Pojo
ProxyFactory factory = new ProxyFactory(new SimplePojo());
factory.adddInterface(Pojo.class);
factory.addAdvice(new RetryAdvice());
factory.setExposeProxy(true);
Pojo pojo = (Pojo) factory.getProxy();
// this is a method call on the proxy!
pojo.foo();
#29
加包或者让serverxxx被代理类实现一个接口
#1
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="execute" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* *..Action.execute())"/>
</aop:config>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/infocum"></property>
<property name="username" value="root"></property>
<property name="password" value=""></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mappingResources">
<list>
<value>com/infoCmu/domain/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.autoReconnect">true</prop>
</props>
</property>
</bean>
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="userServer" class="com.infoCmu.servers.UserServer">
<property name="hibernateTemplate" ref="hibernateTemplate"></property>
</bean>
<bean id="menuAction" class="com.infoCmu.login.action.MenuAction">
<property name="userServer" ref="userServer"></property>
</bean>
</beans>
java:
public class MenuAction extends ActionSupport {
private UserServer userServer;
public void setUserServer(UserServer userServer){
this.userServer = userServer;
}
public String execute(){
// db链接实验
User userobj1 = new User();
userobj1.setUserid("aaa"+(int)Math.floor(Math.random()*1000));
userobj1.setPwd("pwd");
try{
userServer.setUserinfo(userobj1);
}catch(Exception e){
e.printStackTrace();
}
return "success";
}
}
public class UserServer{
public void setUserinfo(User user){
try{
hibernateTemplate.save(user);
}catch(Exception e){
System.out.println(e.getStackTrace());
}
}
HibernateTemplate hibernateTemplate;
public void setHibernateTemplate(HibernateTemplate hibernateTemplate){
this.hibernateTemplate = hibernateTemplate;
}
}
以下是hibernateTool自动生成的mapping代码
package com.infoCmu.obj;
/**
* User generated by hbm2java
*/
public class User implements java.io.Serializable {
private String userid;
private String pwd;
public User() {
}
public User(String userid, String pwd) {
this.userid = userid;
this.pwd = pwd;
}
public String getUserid() {
return this.userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getPwd() {
return this.pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
User.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2013-5-19 18:00:46 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.infoCmu.obj.User" table="user" catalog="infocmu">
<id name="userid" type="string">
<column name="userid" length="20" />
<generator class="assigned" />
</id>
<property name="pwd" type="string">
<column name="pwd" length="20" not-null="true" />
</property>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="execute" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* *..Action.execute())"/>
</aop:config>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/infocum"></property>
<property name="username" value="root"></property>
<property name="password" value=""></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mappingResources">
<list>
<value>com/infoCmu/domain/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.autoReconnect">true</prop>
</props>
</property>
</bean>
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="userServer" class="com.infoCmu.servers.UserServer">
<property name="hibernateTemplate" ref="hibernateTemplate"></property>
</bean>
<bean id="menuAction" class="com.infoCmu.login.action.MenuAction">
<property name="userServer" ref="userServer"></property>
</bean>
</beans>
java:
public class MenuAction extends ActionSupport {
private UserServer userServer;
public void setUserServer(UserServer userServer){
this.userServer = userServer;
}
public String execute(){
// db链接实验
User userobj1 = new User();
userobj1.setUserid("aaa"+(int)Math.floor(Math.random()*1000));
userobj1.setPwd("pwd");
try{
userServer.setUserinfo(userobj1);
}catch(Exception e){
e.printStackTrace();
}
return "success";
}
}
public class UserServer{
public void setUserinfo(User user){
try{
hibernateTemplate.save(user);
}catch(Exception e){
System.out.println(e.getStackTrace());
}
}
HibernateTemplate hibernateTemplate;
public void setHibernateTemplate(HibernateTemplate hibernateTemplate){
this.hibernateTemplate = hibernateTemplate;
}
}
以下是hibernateTool自动生成的mapping代码
package com.infoCmu.obj;
/**
* User generated by hbm2java
*/
public class User implements java.io.Serializable {
private String userid;
private String pwd;
public User() {
}
public User(String userid, String pwd) {
this.userid = userid;
this.pwd = pwd;
}
public String getUserid() {
return this.userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getPwd() {
return this.pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
User.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2013-5-19 18:00:46 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.infoCmu.obj.User" table="user" catalog="infocmu">
<id name="userid" type="string">
<column name="userid" length="20" />
<generator class="assigned" />
</id>
<property name="pwd" type="string">
<column name="pwd" length="20" not-null="true" />
</property>
</class>
</hibernate-mapping>
#2
你的 切面 没有注入 数据源 或 都说是 sessionFactory
<bean id="transactionManager" class="这里是Hibernate的transactionManager工厂类 (至于怎么写我网忘了 好久没用了)">
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<bean id="transactionManager" class="这里是Hibernate的transactionManager工厂类 (至于怎么写我网忘了 好久没用了)">
<tx:advice id="txAdvice" transaction-manager="transactionManager">
#3
二楼的朋友,你的意思是我下面的配置不对是么?
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
#4
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="execute" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
少了个属性吧
#5
<tx:advice id="txAdvice"
transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="execute" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<tx:attributes>
<tx:method name="execute" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
#6
4(5)楼的朋友,谢谢你的回答。
但是transaction-manager的默认值就是"transactionManager",所以不用特别设定。
但是transaction-manager的默认值就是"transactionManager",所以不用特别设定。
#7
本人追加分数到100分,向各位大神求解。
这个事情已经折腾我2天了,拜托了。
这个事情已经折腾我2天了,拜托了。
#8
<aop:config>加上如下属性,试试:
<aop:config proxy-target-class="true">
#9
值栈中userserver为null说明,userserver没注入进去啊。看看你的spring和struts2是否正确整合,另外在你的代码中, <class name="com.infoCmu.obj.User" table="user" catalog="
infocmu">
和<property name="url" value="jdbc:mysql://localhost:3306/ infocum"></property>两个数据库的名字不一样。关键是你的spring和你的struts2是否整合正确啊
和<property name="url" value="jdbc:mysql://localhost:3306/ infocum"></property>两个数据库的名字不一样。关键是你的spring和你的struts2是否整合正确啊
#10
到我的博客下载那个开源项目看看,
基于spring整合的,里面有事务可以参考下做法
基于spring整合的,里面有事务可以参考下做法
#11
一看就是execution(* *..Action.execute())这个有问题。
#12
值栈中userserver为null说明,userserver没注入进去啊。看看你的spring和struts2是否正确整合,另外在你的代码中, <class name="com.infoCmu.obj.User" table="user" catalog=" infocmu">
和<property name="url" value="jdbc:mysql://localhost:3306/ infocum"></property>两个数据库的名字不一样。关键是你的spring和你的struts2是否整合正确啊
只要不加事务处理的切面,程序就是可以的。另外感谢你仔细看了我的程序,才能发现infocum这种细微的地方。我数据库的名字起错了,但是因为是练习,所以懒得改了。改完之后,还是不行,一样的问题。
#13
一看就是execution(* *..Action.execute())这个有问题。
切点的声明我确实有点迷糊。能不能详细点,最好根据我现在的程序,帮我写一下声明?多谢。
#14
改为"execution(*
com.infoCmu.Action.*.*(..))"
根据你具体包名写
根据你具体包名写
#15
<aop:config>加上如下属性,试试:
<aop:config proxy-target-class="true">
加上这个属性启动就报错了。所以应该不是这个的问题。
Caused by: org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.
#16
一看就是execution(* *..Action.execute())这个有问题。
切点的声明我确实有点迷糊。能不能详细点,最好根据我现在的程序,帮我写一下声明?多谢。
确实有可能是切点的声明错误导致其后无法注入,Action应该无法代表MenuAction,这个查一下就知道了
即使先暂时换成MenuAction用来测试
#17
execution(* com.accp.biz.impl.*(这个*代表你的类).*(这个*代表你类中的方法)(..(括号中的两点代表你方法中的参数)))
#18
加上这个属性启动就报错了。所以应该不是这个的问题。
Caused by: org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.
没必要强制aop使用cglib代理,jdk动态代理没有报出错误
#19
改为"execution(* com.infoCmu.Action.*.*(..))"
根据你具体包名写
已经改成如下内容,还是一样的:
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor advice-ref="txAdvice"
pointcut="execution(* com.infoCmu.login.action.MenuAction.execute())"/>
</aop:config>
#20
4(5)楼的朋友,谢谢你的回答。
但是transaction-manager的默认值就是"transactionManager",所以不用特别设定。
这个还不知道呢,学习了
#21
execution(* com.infoCmu.login.action.MenuAction.execute(
..))是不是少了2点啊
#22
还是好好看看aop里面的几个概念再写配置吧
#23
谢谢各位的回复,我现在将事务处理定位在了server,经提示加入了cglib等包之后,在server层形成了事务。
我想也许是因为struts对action有限制所以无法设定切点吧。但我更期望能在action层形成事务,这个问题我回头再找找资料,如果大家还有好的想法,请继续回复。
我下午再研究下,晚上或者明天来结贴。再次感谢!
我想也许是因为struts对action有限制所以无法设定切点吧。但我更期望能在action层形成事务,这个问题我回头再找找资料,如果大家还有好的想法,请继续回复。
我下午再研究下,晚上或者明天来结贴。再次感谢!
#24
<aop:config>加上如下属性,试试:
<aop:config proxy-target-class="true">
果然是这个原因呢,加上这句话,事务处理切面就可以正常处理了,谢谢。
之前报错是因为缺少包,我以为是设定有问题,不好意思,但是切面如果定在server就不用这句话,下午再研究下。
#25
百度上查了很久,也没有找到action必须使用cglib代理,否则无法注入的问题呢,有没有哪位大神能够解释一下?
#26
百度上查了很久,也没有找到action必须使用cglib代理,否则无法注入的问题呢,有没有哪位大神能够解释一下?
使用jdk动态代理的前提是受代理目标对象至少要实现一个接口,如果没有实现任何接口,就得用cglib了
#27
百度上查了很久,也没有找到action必须使用cglib代理,否则无法注入的问题呢,有没有哪位大神能够解释一下?
使用jdk动态代理的前提是受代理目标对象至少要实现一个接口,如果没有实现任何接口,就得用cglib了
那为什么一定要在切面里加入<aop:config proxy-target-class="true">呢?我还实验了一下,加入了序列化的借口serialize,但是也不行。
#28
那为什么一定要在切面里加入<aop:config proxy-target-class="true">呢?我还实验了一下,加入了序列化的借口serialize,但是也不行。
这个配置就是指示使用cglib。
Serializable接口这个倒特别提及,
我查到是这么实现的,假设 SimplePojo implements Pojo
ProxyFactory factory = new ProxyFactory(new SimplePojo());
factory.adddInterface(Pojo.class);
factory.addAdvice(new RetryAdvice());
factory.setExposeProxy(true);
Pojo pojo = (Pojo) factory.getProxy();
// this is a method call on the proxy!
pojo.foo();
#29
加包或者让serverxxx被代理类实现一个接口