JSF Spring 3项目中的事务控制
我在使用JSF2.0和Primefaces、Spring3和Hibernate的项目中遇到了一个问题。 我能够正确地配置整个项目,并且能够很好地使用spring的依赖注入和事务控制以及JSF视图、服务(接口和impl)、DAO(接口和impl)。 但是,每当我尝试列出或删除某个模型的对象时,它都会复制模型表中的当前对象。 以前有人有过这个问题吗? PS:我用@Component(“myBeanName”)注释我的控制器类,这样我的jsf视图就可以理解bean名称来调用方法和使用对象 这是applicationContext.xmlJSF Spring 3项目中的事务控制,spring,hibernate,jsf,transactions,Spring,Hibernate,Jsf,Transactions,我在使用JSF2.0和Primefaces、Spring3和Hibernate的项目中遇到了一个问题。 我能够正确地配置整个项目,并且能够很好地使用spring的依赖注入和事务控制以及JSF视图、服务(接口和impl)、DAO(接口和impl)。 但是,每当我尝试列出或删除某个模型的对象时,它都会复制模型表中的当前对象。 以前有人有过这个问题吗? PS:我用@Component(“myBeanName”)注释我的控制器类,这样我的jsf视图就可以理解bean名称来调用方法和使用对象 这是appl
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<context:component-scan base-package="br.com.dentrio" />
<context:annotation-config />
<context:spring-configured />
<!-- Data Source Declaration -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/dentriodb" />
<property name="user" value="root" />
<property name="password" value="root" />
<property name="maxPoolSize" value="10" />
<property name="maxStatements" value="0" />
<property name="minPoolSize" value="5" />
</bean>
<!-- Session Factory Declaration -->
<bean id="SessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- <property name="packagesToScan"> <list> <value>net.javabeat.spring.model</value>
</list> </property> -->
<property name="packagesToScan" value="br.com.dentrio.model"></property>
<!-- <property name="annotatedClasses"> -->
<!-- <list> -->
<!-- <value>net.javabeat.spring.model.*</value> -->
<!-- </list> -->
<!-- </property> -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
</bean>
<!-- Enable the configuration of transactional behavior based on annotations -->
<tx:annotation-driven transaction-manager="txManager" />
<!-- Transaction Manager is defined -->
<bean id="txManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="SessionFactory" />
</bean>
org.hibernate.dialogue.mysql5dialogue
真的
更新
真的
My faces-config.xml文件
<?xml version="1.0" encoding="utf-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
<application>
<locale-config>
<default-locale>pt_BR</default-locale>
</locale-config>
</application>
<application>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>
<application>
<message-bundle>
messages
</message-bundle>
</application>
pt_BR
org.springframework.web.jsf.el.SpringBeanFacesELResolver
信息
My web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>PrimeFaces Web Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener- class>
</listener>
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
<!-- Change to "Production" when you are ready to deploy -->
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<!-- Welcome page -->
<welcome-file-list>
<welcome-file>home.xhtml</welcome-file>
</welcome-file-list>
<!-- JSF mapping -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map these files with JSF -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
</web-app>
PrimeFaces Web应用程序
上下文配置位置
/WEB-INF/applicationContext.xml
org.springframework.web.context.ContextLoaderListener
org.springframework.web.context.request.RequestContextListener
javax.faces.PROJECT_阶段
发展
home.xhtml
Facesservlet
javax.faces.webapp.FacesServlet
1.
Facesservlet
/面孔/*
Facesservlet
*.jsf
Facesservlet
*.面孔
Facesservlet
*.xhtml
我的Bean控制器
package br.com.managedController;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.view.ViewScoped;
import org.springframework.dao.DataAccessException;
import br.com.dentrio.comum.BaseBean;
import br.com.dentrio.model.Dentista;
import br.com.dentrio.service.DentistaServiceImpl;
@Component("dentistaBean")
public class DentistaBean extends BaseBean implements Serializable {
private static final long serialVersionUID = 1L;
@Autowired
DentistaService dentistaService;
private Date data;
private Dentista dentista = new Dentista();
private Dentista dentistaSelecionado;
List<Dentista> listaDentistas = new ArrayList<Dentista>();
public void prepararPedidos() {
carregarListaDentistas();
}
@PostConstruct
private void carregarListaDentistas() {
listaDentistas = new ArrayList<Dentista>();
listaDentistas.addAll(dentistaService.listDentistas());
}
public String adicionarDentista() {
try {
dentistaService.addDentista(dentista);
carregarListaDentistas();
addMessage("Sucesso", "Dentista adicionado com Sucesso!");
return "listarDentistas?faces-redirect=true";
} catch (DataAccessException e) {
e.printStackTrace();
}
return ERROR;
}
public void deletarDentista(Integer dentistaId) {
try {
Dentista dentista = dentistaService.getDentista(dentistaId);
dentistaService.deletarDentista(dentista);
addMessage("Sucesso", "Dentista deletado com Sucesso!");
carregarListaDentistas();
} catch (Exception e) {
e.printStackTrace();
}
}
public void resetForm() {
dentista = new Dentista();
}
public Dentista getDentista() {
return dentista;
}
public void setDentista(Dentista dentista) {
this.dentista = dentista;
}
public Date getData() {
return data;
}
public void setData(Date data) {
this.data = data;
}
public List<Dentista> getListaDentistas() {
return listaDentistas;
}
public void setListaDentistas(List<Dentista> listaDentistas) {
this.listaDentistas = listaDentistas;
}
public Dentista getDentistaSelecionado() {
return dentistaSelecionado;
}
public void setDentistaSelecionado(Dentista dentistaSelecionado) {
this.dentistaSelecionado = dentistaSelecionado;
}
public DentistaService getDentistaService() {
return dentistaService;
}
public void setDentistaService(DentistaService dentistaService) {
this.dentistaService = dentistaService;
}
}
package br.com.managedController;
导入java.io.Serializable;
导入java.util.ArrayList;
导入java.util.Date;
导入java.util.List;
导入javax.annotation.PostConstruct;
导入javax.faces.bean.ManagedBean;
导入javax.faces.bean.ManagedProperty;
导入javax.faces.view.ViewScoped;
导入org.springframework.dao.DataAccessException;
导入br.com.dentrio.comum.BaseBean;
导入br.com.dentrio.model.Dentista;
导入br.com.dentrio.service.DentistaServiceImpl;
@组件(“dentistaBean”)
公共类DentistaBean扩展BaseBean实现可序列化{
私有静态最终长serialVersionUID=1L;
@自动连线
牙医服务;;
私人日期数据;
私人牙医=新牙医();
私人牙医;
List listaDentistas=new ArrayList();
公共无效预处理程序pedidos(){
Carregarlistatististas();
}
@施工后
私人空置卡雷加利牙医(){
listaDentistas=newarraylist();
addAll(dentistaService.listDentistas());
}
公共字符串adicionarDentista(){
试一试{
牙医服务。添加牙医(牙医);
Carregarlistatististas();
添加消息(“Sucesso”,“Dentista adicionado com Sucesso!”);
返回“listarDentistas?faces redirect=true”;
}捕获(数据访问异常){
e、 printStackTrace();
}
返回误差;
}
公共void deletarDentista(整数dentistaId){
试一试{
Dentista Dentista=牙医服务。getDentista(dentistaId);
牙科医生服务。牙科医生(牙科医生);
addMessage(“Sucesso”,“Dentista deletado com Sucesso!”);
Carregarlistatististas();
}捕获(例外e){
e、 printStackTrace();
}
}
公共表格(){
牙医=新牙医();
}
公共牙医{
回归牙医;
}
公共牙科医生(牙科医生){
这个。牙医=牙医;
}
公共日期getData(){
返回数据;
}
公共无效设置数据(日期数据){
这个数据=数据;
}
公共列表getListaDentistas(){
返回列表状态;
}
公共无效集合列表数据集(列表数据集){
this.listaDentistas=listaDentistas;
}
公共牙医{
返回牙医诊所;
}
公共无效设置牙科医生selecionado(牙科医生selecionado){
this.dentistaseleconado=dentistaseleconado;
}
公共牙医服务{
返回牙医服务;
}
公共无效设置DestinstaService(DestinstaService DestinstaService){
this.dentistaService=牙医服务;
}
}
我要做的是将Spring服务作为托管属性注入JSFbean中。您可以毫无问题地使用@ViewScoped
@ViewScoped
public class bean{
@ManagedProperty(value="#{springService}")
private SpringService springService;
//getter and setter
请提供您的源代码更新代码在这里。。。如果您需要其他文件,我可以把它们发布在这里,比如服务接口和impl类或DAOsAnyone???我想可能是spring事务错误或idk。问题是我的@Transactional注释,它放错了地方。无论如何,谢谢你的回答