我知道这个问题在这里和互联网上已被多次询问,我已经阅读了很多这些答案,但我仍然不明白解决这个问题的正确方法.我正在尝试使用Spring MVC和JPA,每次访问一个延迟加载的属性时,我都会得到一个LazyInitializationException.
以下是我正在尝试的一些代码:
@Repository
public class MyDAO {
private static final Logger logger = LoggerFactory.getLogger(MyDAO.class);
@PersistenceContext
private EntityManager em;
@Transactional
public void logDOI() {
DOI myDOI = em.find(DOI.class, Long.valueOf(1));
// This line gives the expected output
logger.info("Fetched DOI: " + myDOI.getDoiKey());
// This line throws the LazyInitalizationException
for(DOIMembership m : myDOI.getDoiMemberships()) {
logger.info("Got DOI Membership id: " + m.getId());
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在访问的实体:
@Entity
@Table(name="DOI")
public class DOI implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name="DOI_ID_GENERATOR", …Run Code Online (Sandbox Code Playgroud) 背景
由于Spring MVC设计了standered servlets,并促进相同的功能servlet context和application context.在春季存在两种类型的上下文ApplicationContext和WebApplicationContext-
ApplicationContext初始化ContextLoaderListener,每个应用程序的单个实例.
WebApplicationContext每个人加载DispatcherServlet.
我们可以理解上面这样ApplicationContext延伸,WebApplicationContext所以ApplicationContext最终与之相关的东西都是其中的一部分WebApplicationContext.
疑惑
ApplicationContextAware提供哪个context对象.
public class SomeThing implements ApplicationContextAware{
@Override
public void setApplicationContext(ApplicationContext ctx) throws BeanException{
//this context object is `ApplicationContext` or `WebApplicationContext`?
}
}
Run Code Online (Sandbox Code Playgroud)context并且container似乎是我们大多数人的同义词,我想举个例子.假设我们有两个调度程序servlet一个用于
rest和另一个用于mvc.
第一个调度员 -
public class …Run Code Online (Sandbox Code Playgroud)我尝试为ProductDAO类运行JUnit测试用例,这是spring Web应用程序的一部分.但它仍然失败.我不确定我的test-context.xml文件.
我ProductDAOImplTest在路径中有类,src/test/java并且ProductController在栈中提到的类被保存在路径中src/main/java.
ProductDAOImplTest
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/test/resources/test-context.xml")
@Transactional
public class ProductDAOImplTest {
@Autowired
private ProductDAO productDAO;
@Test
public void testAdd() {
fail("Not yet implemented");
}
@Test
public void testEdit() {
fail("Not yet implemented");
}
@Test
public void testGetAll() {
fail("Not yet implemented");
}
@Test
public void testGet() {
fail("Not yet implemented");
}
@Test
public void testRemove() {
fail("Not yet implemented");
}
@Test
public void testGetByPage() {
fail("Not yet implemented");
}
} …Run Code Online (Sandbox Code Playgroud) 我试图在我的Spring MVC项目中使用Spring的DomainClassConverter功能.(我对Spring MVC和Spring只有非常基本的知识,对于任何天真的问题都提前道歉).
来自API文档:
The DomainClassConverter allows you to use domain types in your Spring MVC controller
method signatures directly, so that you don't have to manually lookup the instances via
the repository: (PS: Example 1.20)
Run Code Online (Sandbox Code Playgroud)
我从上面的理解是,我不必编写finder方法,Spring提供了User对象.所以这些是我做的步骤:
包括以下XML行applicationcontext.xml.
<bean class="org.springframework.data.web.config.SpringDataWebConfiguration" />
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.rl.userservice.controller.UserConverter"/>
</list>
</property>
Run Code Online (Sandbox Code Playgroud)
pom.xml根据Spring Data REST文档中包含此依赖项:
Run Code Online (Sandbox Code Playgroud)<dependencies> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-rest-webmvc</artifactId> <version>2.0.0.BUILD-SNAPSHOT</version> </dependency> </dependencies>
我的控制器如下所示:
Run Code Online (Sandbox Code Playgroud)@Controller @RequestMapping(value = "/api/newuser") public class NewUserServiceController { @Autowired …
Spring Security基本示例给出了此异常.
错误:"通用匹配模式('/**')在过滤器链中的其他模式之前定义,导致它们被忽略.请检查命名空间或FilterChainProxy bean配置中的顺序"
我在同一个问题上查了很多帖子.但找不到任何解决方案.任何人都可以部署一个hello spring security吗?
我使用的是这些版本 - Spring 3.2.0.RELEASE/Spring security 3.2.0.RELEASE/Tomcat 7/Java 1.7.
这是我的代码:
web.xml中
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Spring security sample Web Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-context.xml,
/WEB-INF/security-context.xml</param-value>
</context-param>
<!-- Spring security -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>spring-dispatcher-servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-context.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>spring-dispatcher-servlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)
弹簧的context.xml
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd">
<authentication-manager>
<authentication-provider>
<user-service>
<user …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的应用程序中实现电子邮件功能,但我一直在努力
No matching bean of type [org.springframework.mail.javamail.JavaMailSenderImpl] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency.
Run Code Online (Sandbox Code Playgroud)
谁能指出我做错了什么?
bean的xml配置是:
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<context:annotation-config/>
//...other stuff
<beans:bean id="mailSession" class="org.springframework.jndi.JndiObjectFactoryBean">
<beans:property name="jndiName" value="EmailServer" />
</beans:bean>
<beans:bean id="emailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<beans:property name="session" ref="mailSession"/>
</beans:bean>
Run Code Online (Sandbox Code Playgroud)
EmailServiceImpl类:
@Service
public class EmailServiceImpl implements EmailService {
@Autowired
private JavaMailSenderImpl emailSender;
//more code..
}
Run Code Online (Sandbox Code Playgroud)

我们为什么需要applicationContext.xml在Spring?
在什么情况下我们会使用它?你有一个例子吗?
applicationContext.xml和之间有什么区别spring-servlet.xml?
我们如何applicationContext.xml在Spring中与Struts.xmlStruts进行比较以便于理解?
我有一个@Transactional @Controller,但它的方法正在被 Spring MVC 框架调用而没有事务。在异常跟踪中,我没有找到拦截调用的事务顾问:
org.hibernate.HibernateException: No Session found for current thread
org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:106)
org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014)
org.example.businesslogic.MyController.userLoggedIn(SwiperRest.java:48)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:483)
org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
Run Code Online (Sandbox Code Playgroud)
另一方面,日志清楚地表明控制器方法被检测为事务性的:
DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.transaction.config.internalTransactionAdvisor'
DEBUG o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'metaDataSourceAdvisor'
DEBUG o.s.t.a.AnnotationTransactionAttributeSource - Adding transactional method 'MyController.userLoggedIn' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
DEBUG o.s.a.f.a.InfrastructureAdvisorAutoProxyCreator - Creating implicit proxy for bean 'myController' with 0 common interceptors and 1 specific interceptors
DEBUG o.s.a.f.CglibAopProxy …Run Code Online (Sandbox Code Playgroud) 我正在尝试配置spring安全注释,我已经设法在xml中设置spring安全配置(由intercept-url元素配置),但现在我想在我的bean中使用安全注释.但是在尝试访问安全控制器方法而没有记录时,完全忽略了安全注释.这是我的控制器bean:
package com.bill.controllers;
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MainController {
@Secured({"ROLE_USER"})
@RequestMapping("/index.html")
public String main(ModelMap model) {
model.addAttribute("test", "test");
return "main";
}
}
Run Code Online (Sandbox Code Playgroud)
和登录控制器:
package com.bill.controllers;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class LoginController {
@RequestMapping("/login")
public String login(ModelMap model) {
return "login";
}
}
Run Code Online (Sandbox Code Playgroud)
和配置:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>tests</display-name>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring-servlet.xml, …Run Code Online (Sandbox Code Playgroud) 我有一个问题,Spring将DAO对象的代理注入到服务中,但是这个服务被注入到控制器中它是具体的类.这不允许我使用服务范围的事务并分别为每个DAO调用启动事务.这是我期望的行为.
组态:
Controller是带有@Controller注释和构造函数DI的类.
服务:
@Component
@Transactional
public class UserServiceImpl implements UserService { ...}
道:
@Component
@Transactional
public class UserDaoImpl implements UserDao {
JPA配置:
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
<property name="dataSource" ref="dataSource"/>
<property name="persistenceUnitName" value="xxxPersistenceUnit"/>
<property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
</bean>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:annotation-driven />
Run Code Online (Sandbox Code Playgroud)
任何人都知道为什么会这样?
我创建了一个使用一些 Autowired 字段的 servlet 过滤器。为了使它工作,我DelegatingFilterProxy在 web.xml 中声明了它。在此过滤器之前,我的整个 spring 配置都在,dispatcher-servlet.xml但由于某种原因,此过滤器的声明 bean 在 dispacher-servlet 中不起作用。所以,我在applicationContext.xml. 然后它开始工作,但过滤器内的 Autwired 字段然后抛出null. 为了解决它,我移动了
<context:component-scan base-package="com.myproj.abc" />
Run Code Online (Sandbox Code Playgroud)
到 applicationContext,过滤器开始工作,但我的控制器类定义的 url 路径不再映射。所以我还需要在 applicationContext 中拉出以下两行
<mvc:default-servlet-handler />
<mvc:annotation-driven />
Run Code Online (Sandbox Code Playgroud)
这解决了这个问题。但我想知道这是所有这些代码的正确位置吗?因为 Spring 安全性以及静态资源和视图映射所有这些代码都在调度程序中。在我的另一个项目中,我遇到了同样的问题,我确实这样做了,仅在 applicationContext 中声明了以下行
<context:component-scan base-package="com.myproj.abc" />
Run Code Online (Sandbox Code Playgroud)
在调度程序 servlet 中,我将组件扫描包更改为仅控制器,并将所有其他代码仅保留在那里(在调度程序中)
<context:component-scan base-package="com.myproj.abc.controller" />
Run Code Online (Sandbox Code Playgroud)
任何人都可以请教我这种混乱。
spring ×10
java ×7
spring-mvc ×6
jpa ×2
annotations ×1
autowired ×1
data-binding ×1
hibernate ×1
java-7 ×1
junit ×1
security ×1
spring-data ×1
spring-jdbc ×1
testcase ×1
tomcat7 ×1
transactions ×1