我已經開發了一個使用Spring MVC + Hibernate的webapp,並使用三層,控制器層,服務層和道層。@Transactional控制器方法不工作與休眠會話
現在我想爲我的webapp提供一個REST api。因爲我有一個GenericDao,它提供了find(id),findAll(),findByProperty()這樣的泛型方法,我以爲我可以跳過Api控制器中的服務層,並將控制檯注入到控制器本身,否則我會必須爲這些通用find,findAll方法的每個域對象創建特定於類的方法,這在我只想預置原始數據時很麻煩。
我的第一個更通用的問題是關於這個架構決定。這是一個好的解決方案嗎?
我的第二個(也是主要的)問題是我在使用@Transactional
註釋我的Controller方法時遇到問題,因此打開了一個hibernate會話。看起來它根本不工作。
我甚至在this question中說明了一個接口。
IApiController
@Controller
public interface IApiController {
@ResponseBody
public String getStation(Long id);
@ResponseBody
public String getStations();
}
ApiController
@Controller
@RequestMapping("/api")
public class ApiController extends BaseApiController implements IApiController {
@Autowired
private IStationDao stationDao;
@RequestMapping(value = "stations/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
@Transactional(readOnly=true)
public String getStation(@PathVariable Long id){
Station station = stationDao.findById(id);
return pack(station);
}
@Override
@RequestMapping(value = "stations", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
@Transactional(readOnly=true)
public String getStations() {
List<Station> stations = stationDao.findAll();
return pack(stations);
}
}
當我打電話api/stations
我得到一個HibernateException: No Session found for current thread
語境配置
<context:component-scan base-package="my controller package" />
<mvc:annotation-driven />
<context:annotation-config />
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="SessionFactory" />
</bean>
<bean id="SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
<property name="mappingLocations">
<list>
<value>classpath*:/hbm/*.hbm.xml</value>
</list>
</property>
</bean>
看看這個,我個人認爲移動DAO注射到服務層是更好比擁有它在控制器中,你會感謝你自己稍後再做。 http://stackoverflow.com/questions/1079114/spring-transactional-annotation-best-practice 爲交易,我認爲你必須配置交易http://stackoverflow.com/questions/14090547/spring-annotation-transaction -mangement – Zeus
如果可以的話,我會給予@Zeus評論+10。事務管理和DAO注入屬於服務層,不屬於UI層一部分的控制器。 – Olaf
你可以發佈你的spring數據源和事務配置嗎? – erencan