- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 GWT 框架下设置 Spring 和 Hibernate 时遇到问题。我对 GWT 还很陌生。我已经设置了应用程序上下文并加载,没有输出错误,但目前的主要问题是我的服务层实现 (PobaseServiceImpl) 需要我在 appcontext 中设置的 DAO,但它没有包装 DAO。当然,我的 RPC 尝试调用 dao 方法会导致 NullPointerException。当我初始化时,TransactionProxyFactoryBean 没有设置 pobaseDao。
总结: DAO 应该由 Spring 创建(即配置到)Spring 中,就像我的其他服务一样。然后通过Spring注入(inject)到服务中。然后使用 DAO,将其包装在 Spring 事务代理 (org.springframework.transaction.interceptor.TransactionProxyFactoryBean) 中,并为其提供 Hibernate SessionFactory (org.springframework.orm.hibernate4.LocalSessionFactoryBean)。但由于某种原因它没有设置 dao
所以我的应用程序上下文是通过 ServletContextListener 加载的。这是我的应用程序上下文:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<!--
Spring Framework application context definition for the POBASE Website.
-->
<beans>
<!-- Configurer that replaces ${...} placeholders with values from a properties file -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:/pobase.properties</value>
<value>file:${user.home}/pobase.properties</value>
</list>
</property>
<property name="ignoreResourceNotFound" value="no"/>
</bean>
<!-- Hibernate Data Source -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${pobase.database.driver}" />
<property name="url" value="${pobase.database.url}" />
<property name="username" value="${pobase.database.user}" />
<property name="password" value="${pobase.database.password}" />
</bean>
<!-- Hibernate SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="packagesToScan" value="nz.co.doltech.pobase.client.entity"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${pobase.hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${pobase.hibernate.show_sql}</prop>
<prop key="javax.persistence.validation.mode">none</prop>
</props>
</property>
</bean>
<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- Default transaction proxy, defining the transactional behaviour for
a typical Dao configuration -->
<bean id="baseDaoTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<value>*=PROPAGATION_MANDATORY</value>
</property>
</bean>
<!-- Default transaction proxy, defining the transactional behaviour for
a typical Service configuration -->
<bean id="baseServiceTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<value>*=PROPAGATION_REQUIRED</value>
</property>
</bean>
<!-- ========================= BUSINESS OBJECT DEFINITIONS ========================= -->
<bean id="pobaseDao" parent="baseDaoTransactionProxy">
<property name="target" ref="pobaseDaoTarget" />
</bean>
<bean id="pobaseDaoTarget" class="nz.co.doltech.pobase.server.dao.PobaseHibernateDao">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="pobaseService" parent="baseServiceTransactionProxy">
<property name="target" ref="pobaseServiceTarget" />
</bean>
<bean id="pobaseServiceTarget" class="nz.co.doltech.pobase.server.service.PobaseServiceImpl">
<property name="pobaseDao" ref="pobaseDao" />
<!-- property name="accessControlService" ref="accessControlService" />
<property name="lookupService" ref="lookupService"/>
<property name="notificationService" ref="notificationService"/ -->
</bean>
</beans>
这是我的 RPC servlet 实现:
package nz.co.doltech.pobase.server.service;
/**
* Extends RSS and implements the PobaseService
* @author Ben
*/
@SuppressWarnings("serial")
public class PobaseServiceImpl extends RemoteServiceServlet implements PobaseService {
@SuppressWarnings("unused")
private static final Logger logger = Logger.getLogger(PobaseServiceImpl.class.getName());
private PobaseDao pobaseDao;
private final HashMap<Integer, PobaseEntity> pobaseEntities = new HashMap<Integer, PobaseEntity>();
private void fetchExternPobase()
{
pobaseEntities.clear();
List<PobaseEntity> pobaseList = pobaseDao.getAllPobase();
for (int i = 0; i < pobaseList.size(); i++)
{
PobaseEntity en = pobaseList.get(i);
if(en != null) {
pobaseEntities.put(en.getId(), en);
}
}
}
public void setPobaseDao(PobaseDao dao)
{
this.pobaseDao = dao;
}
public PobaseDao getPobaseDao()
{
return this.pobaseDao;
}
public PobaseData addLocalPobase(PobaseData pobase)
{
PobaseEntity entity = new PobaseEntity();
entity.mirrorObjectData(pobase);
pobase.setId(pobaseEntities.size());
pobaseEntities.put(pobase.getId(), entity);
return entity.getDataObject();
}
public PobaseData updateLocalPobase(PobaseData pobase)
{
PobaseEntity entity = new PobaseEntity();
entity.mirrorObjectData(pobase);
pobaseEntities.remove(entity.getId());
pobaseEntities.put(entity.getId(), entity);
return entity.getDataObject();
}
public Boolean deleteLocalPobase(int id)
{
pobaseEntities.remove(id);
return true;
}
public ArrayList<PobaseData> deleteLocalPobases(ArrayList<Integer> ids)
{
for (int i = 0; i < ids.size(); ++i) {
deleteLocalPobase(ids.get(i));
}
return getLocalPobaseData();
}
public ArrayList<PobaseData> getLocalPobaseData()
{
ArrayList<PobaseData> pobaseList = new ArrayList<PobaseData>();
Iterator<Integer> it = pobaseEntities.keySet().iterator();
while(it.hasNext())
{
PobaseData pobase = pobaseEntities.get(it.next()).getDataObject();
pobaseList.add(pobase);
}
return pobaseList;
}
public PobaseData getLocalPobase(int id)
{
return pobaseEntities.get(id).getDataObject();
}
public ArrayList<PobaseData> resyncExternPobase()
{
fetchExternPobase();
return getLocalPobaseData();
}
}
这里还有 Web 应用程序的启动日志:
ServletContextListener started
Nov 12, 2012 8:20:33 PM nz.co.doltech.pobase.SpringInitialiser initSpringContext
INFO: Creating new Spring context. Configs are [/nz/co/doltech/pobase/appcontext.xml]
Nov 12, 2012 8:20:33 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@8423321: startup date [Mon Nov 12 20:20:33 NZDT 2012]; root of context hierarchy
Nov 12, 2012 8:20:33 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [nz/co/doltech/pobase/appcontext.xml]
Nov 12, 2012 8:20:33 PM org.springframework.core.io.support.PropertiesLoaderSupport loadProperties
INFO: Loading properties file from class path resource [pobase.properties]
Nov 12, 2012 8:20:33 PM org.springframework.core.io.support.PropertiesLoaderSupport loadProperties
INFO: Loading properties file from URL [file:/home/ben/pobase.properties]
Nov 12, 2012 8:20:33 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@4c56666d: defining beans [org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,dataSource,sessionFactory,transactionManager,baseDaoTransactionProxy,baseServiceTransactionProxy,pobaseDao,pobaseDaoTarget,pobaseService,pobaseServiceTarget]; root of factory hierarchy
Nov 12, 2012 8:20:33 PM org.springframework.jdbc.datasource.DriverManagerDataSource setDriverClassName
INFO: Loaded JDBC driver: org.postgresql.Driver
Nov 12, 2012 8:20:33 PM org.hibernate.annotations.common.Version <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.1.Final}
Nov 12, 2012 8:20:33 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.1.7.Final}
Nov 12, 2012 8:20:33 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Nov 12, 2012 8:20:33 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
Nov 12, 2012 8:20:34 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
Nov 12, 2012 8:20:34 PM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation
INFO: HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
Nov 12, 2012 8:20:34 PM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
Nov 12, 2012 8:20:34 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Nov 12, 2012 8:20:34 PM org.springframework.orm.hibernate4.HibernateTransactionManager afterPropertiesSet
INFO: Using DataSource [org.springframework.jdbc.datasource.DriverManagerDataSource@55acc0d4] of Hibernate SessionFactory for HibernateTransactionManager
Starting Jetty on port 8888
有人知道它为什么不起作用吗?这里有一些规范:
感谢我能得到的任何帮助!
干杯,本
最佳答案
您的PobaseServiceImpl
类不是线程安全的。在Java中,任何远程调用的服务(当然容器中的单例也是如此)都应该准备好从不同的线程调用其方法,并且可以在不同的线程中同时执行相同的方法。
整个类(class)需要进行详细检查。
首先,您应该使用 ConcurrentHashMap
而不是HashMap
。所有方法都需要仔细重写 - 例如返回 ArrayList 的方法( public ArrayList<PobaseData> resyncExternPobase()
)应制作数据的防御性副本。
作为替代方案,您应该考虑使公共(public)方法与您的服务方法同步,但是,这将强制这些方法按顺序执行,并且如果预计从不同线程主动使用该服务,则会降低性能。
作为引用,请考虑阅读 Brian Goetz Java Concurrency In Practice ,第 5 章。构建 block ,尤其是5.1 同步集合和5.2。并发集合
更新:您的PobaseServiceImpl似乎是一个由servlet容器实例化的servlet - 要使用Spring bean填充其字段,您应该使用Spring实用程序方法 - 例如 WebApplicationContextUtils
- 互联网上有很多例子,例如 http://pgt.de/2009/07/17/non-invasive-gwt-and-spring-integration-reloaded/
关于java - Spring TransactionProxyFactoryBean 未加载 dao 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13341339/
我有组件需要更新客户和客户地址的数据库(通过 JDBC)。从 CustomerDAO 调用 CustomerAddressDAO 是否合适?或者创建一个单独的“CustomerDataManager”
任何人都可以解释MS Access 2007中DAO.Recordset,DAO.Recordsets和DAO.Recordset2之间的区别吗?基本上使用记录集。...举一个例子,使它更清晰。我从“
所以我正在编写一个个人项目来学习 Web 编程,并且我遇到了 DAO 模式。我构建了一些类(模型),并且像几乎所有程序一样,它们是嵌套的(例如:类 Payment 具有对 Author 实例的引用)。
我有一个基本问题。 我一直在创建关注点分离的 DAO。每个 DAO 都专注于上下文中的 BusinessObject。我的问题是如何在另一个 DAO 中使用一个 DAO 方法。我认为这是错误的,但没有
有没有办法使用 Android Room Persistence Library 将 DAO 作为依赖项添加到其他 DAO 中,也许是使用 Dagger2?我试图避免在使用事务对多个表执行操作的 DA
通常,我会尝试以一种完全依赖于自身的方式来构建我的 DAO 类。它们可以与多个表交互,但前提是数据与基础对象相关。例如,假设我有一个约会对象,约会 DAO 从约会表中提取数据。如果约会表是一个服务 i
在学校学习过 Java 后,我对 DAO 模式( Data access object )非常熟悉。然而在工作中我使用.NET。在 .NET 中,经常讨论 DAL( Data Access Layer
我一直在尝试按照以下步骤创建一个通用的 DAO: http://www.ibm.com/developerworks/java/library/j-genericdao/index.html 不过,我
Java EE 中的最佳实践是什么? 在服务(或管理器)类中创建 DAO 类的实例 SalesDAO salesDao = new SalesDAOImpl(); salesDao.findCusto
这有道理吗? 假设我需要从 DB 中获取一个对象,该对象与另一个对象有关系(由 DB 中的外键表示,并由我的域对象中的组合表示)。如果在我的第一个 DAO 中,我为对象 1 获取数据,然后为对象 2
我目前正在为应用程序创建数据访问层。此应用程序最初将连接到 Oracle 数据库,但稍后也会连接到 DB2 数据库。 为了连接到数据库,我将使用 JDBC。在这个时候我正在考虑我的选择。在我看来,我有
我正在 JSF 中设计一些数据“块” 我从每个块的 Java bean 中获取我的数据。 我的问题是我的块从多个表中获取数据。 例如: 描述 的块客户的个人资料 由组成: 客户名称(在表 客户 中)
将 DAO 类与应用程序代码中实际实例化的 DAO 类分开有什么好处,即为什么不在这样的场景中直接实例化 DAO 类: Class CreateIocContainer{ p s v main
我正在为我的 DataNucleus JDO DAO 创建通用 DAO。通用 DAO 将执行获取、更新、删除、创建操作和一些其他通用操作,因此这些实现可以在更具体的 DAO 中进行扩展。 是否有可能以
这可能是一件非常微不足道的事情,但我是一些面向对象模式的新手。 简而言之,在另一个 DAO 中使用一个 DAO 中的方法是一种不好的做法吗?我试图在 DAO 中创建一个实体,但发现仅使用该 DAO 很
我参与了一个 Java 项目,该项目从不同的支付代理获取支付信息,对其进行处理并将其存储到我们的计费系统(数据库)中。 由于我们有不同的代理,因此支付协议(protocol)也不同,因此我们有时有相似
考虑以下 Room DAO @Dao public abstract class JobDao { @Insert public abstract long insert( Job v
我有一个“容器”类,其字段包含在多个数据库表中,我使用 DAO 模式来访问数据。 问题是,我应该为这个“容器”类创建一个 DAO,还是每个表有一个 DAO 并合并它们的数据更好? 最佳答案 您应该根据
我们正在通过 @Service 和 @Component 注释使用 Spring @Autowired 改造一个新的面向服务的架构。 我一直在和我的同事争论不让每个 DAO 都有接口(interfac
我有通用的 DAO: @NoRepositoryBean interface ICrudDao extends Repository { void delete(T deleted);
我是一名优秀的程序员,十分优秀!