小编Cor*_*rey的帖子

在Spring 3/Hibernate中回滚事务的最佳实践

引用Spring文档:

任何RuntimeException都会触发回滚,任何已检查的Exception都不会

引用javapractices.com

未经检查的例外情况:

  • 表示程序中的缺陷(错误) - 通常是传递给非私有方法的无效参数.引用来自Gosling,Arnold和Holmes的Java编程语言:"未经检查的运行时异常表示一般来说,它反映了程序逻辑中的错误,并且无法在运行时合理地恢复."
  • 是RuntimeException的子类,通常使用IllegalArgumentException,NullPointerException或IllegalStateException实现
  • 方法没有义务为其实现抛出的未经检查的异常建立策略(并且它们几乎总是不这样做)

检查异常:

  • 代表程序直接控制范围之外的区域中的无效条件(无效的用户输入,数据库问题,网络中断,缺少文件)
  • 是Exception的子类
  • 方法有义务为其实现抛出的所有已检查异常建立策略(将已检查的异常传递到堆栈中,或以某种方式处理它)

如果在我的业务逻辑中我发现了一个问题并且我想要回滚更改,我必须抛出一个新的RuntimeException?它不是真正的RuntimeException(未经检查的异常),因为我已经在逻辑中识别出它.或许我误解了这些概念?

我真正的问题是,在我的@Transactional服务方法中回滚事务的最佳做法是什么?

java spring hibernate transactions spring-mvc

19
推荐指数
2
解决办法
3万
查看次数

Spring/Hibernate @Transactional - 会话应该关闭之前

我无法弄清楚为什么,但Hibernate会话才应该关闭,所以我无法获取延迟加载的列表.

在日志中,它显示会话在DAO内的hibernateTemplate.findByNamedParam()之后立即关闭.

当我运行我的网络应用程序时,我收到以下错误:

Mar 29, 2011 3:13:21 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Spring MVC Dispatcher Servlet] in context with path [/apps] threw exception [Request processing failed; nested exception is org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.communitydriven.apps.entities.Project.tags, no session or session was closed] with root cause
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.communitydriven.apps.entities.Project.tags, no session or session was closed
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372)
    at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:365)
    at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:108)
    at org.hibernate.collection.PersistentBag.iterator(PersistentBag.java:272)
    at com.communitydriven.apps.managers.ProjectManager.getProject(ProjectManager.java:98)
    at com.communitydriven.apps.controllers.ProjectController.getViewProject(ProjectController.java:86) …
Run Code Online (Sandbox Code Playgroud)

spring hibernate transactions spring-mvc

16
推荐指数
1
解决办法
1万
查看次数

Spring MVC:相对URL问题

我有一个控制器绑定URL:"/ ruleManagement".

在我的JSP中,我有一个表单,可以转发(提交)到"ruleManagement/save"url.如果输入字段有错误,我希望它返回原始表单View.这是问题的开始......

问题1)现在URL是"/ ruleManagement/save",我的表单提交现在指向"/ ruleManagement/ruleManagement/save".

问题2)我尝试使用spring:url标签为我生成绝对路径,这通常很有效.但是当我在标签内部放置一个spring:url标签时,spring:url标签无法正确解析.

<form:form action="<spring:url value='/ruleManagement/save' ...>" method="post">
Run Code Online (Sandbox Code Playgroud)

当我在页面加载后分析DOM时,我的表单标签看起来像:

<form action='<spring:url value="/ruleManagement/save" />' ... >
Run Code Online (Sandbox Code Playgroud)

如果我不使用spring:url标签,而只使用"/ ruleManagement/save",则生成的url会在url中排除我的应用程序名称,这也是错误的.

无论路径如何,如何在所有视图中生成一致的URL模式?如果答案是"使用spring:url",我如何在表单:form标签中获取该内容?

java spring jsp jstl spring-mvc

12
推荐指数
1
解决办法
1万
查看次数

如何记录Spring的SimpleMappingExceptionResolver的异常堆栈跟踪

我正在开发一个项目,其中异常处理是由不再在这里提供帮助的其他人创建的.

他们创建了以下bean,它捕获所有未捕获的异常并转发到JSP View.

<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
  <property name="exceptionMappings">
    <map>
      <entry key="java.lang.Exception" value="error"/>
    </map>
  </property>
  <property name="defaultErrorView" value="error" />
</bean>
Run Code Online (Sandbox Code Playgroud)

它工作正常,但是如果我想获得抛出的异常并在我们的日志中报告它会怎么样?如何将其转发到Java类而不是View?

java spring exception-handling exception spring-mvc

9
推荐指数
1
解决办法
5371
查看次数

如何为"虚拟文件"列表创建ZIP文件并输出到httpservletresponse

我的目标是将多个java.io.File对象放入zip文件并打印到HttpServletResponse以供用户下载.

这些文件是由JAXB marshaller创建的.它是一个java.io.File对象,但它实际上不在文件系统上(它只在内存中),因此我无法创建FileInputStream.

我见过的所有资源都使用OutputStream来打印zip文件内容.但是,所有这些资源都使用FileInputStream(我无法使用).

谁知道我怎么能做到这一点?

java zip spring servlets spring-mvc

6
推荐指数
2
解决办法
7704
查看次数

使用Java配置的Spring root和servlet上下文

我正在Servlet 3.0+环境中运行Spring应用程序,以使用所有Java配置以编程方式配置servlet上下文.我的问题(详见下文):如何构建项目以支持根和Web应用程序上下文的组件扫描,而无需重复组件初始化?

据我了解,有两种情况可以注册Spring bean.首先,根上下文是非servlet相关组件所在的位置.例如批处理作业,DAO等.其次,servlet上下文是与servlet相关的组件所在的位置,例如控制器,过滤器等.

我已经实现了一个WebApplicationInitializer来注册这两个上下文,就像WebApplicationInitializer中的JavaDoc用AppConfig.class和DispatcherConfig.class指定一样.

我希望两者都能自动找到它们各自的组件,所以我将@ComponentScan添加到两者中(这导致我的Hibernate实体被启动两次).Spring通过扫描一些指定的基础包来找到这些组件.这是否意味着我需要将所有与DAO相关的对象放在与控制器不同的包中?如果是这样,那将是非常不方便的,因为我通常喜欢按功能打包(而不是类型).

代码片段......

WebApplicationInitializer:

public class AppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) throws ServletException {
        // Create the 'root' Spring application context
        AnnotationConfigWebApplicationContext rootContext =
                new AnnotationConfigWebApplicationContext();
        rootContext.register(AppConfig.class);

        // Manage the lifecycle of the root application context
        container.addListener(new ContextLoaderListener(rootContext));

        // Create the dispatcher servlet's Spring application context
        AnnotationConfigWebApplicationContext dispatcherContext =
                new AnnotationConfigWebApplicationContext();
        dispatcherContext.register(WebAppConfig.class);

        // Register and map the dispatcher servlet
        ServletRegistration.Dynamic dispatcher =
                container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }

}
Run Code Online (Sandbox Code Playgroud)

AppConfig的:

@Configuration
@ComponentScan …
Run Code Online (Sandbox Code Playgroud)

spring spring-mvc

4
推荐指数
1
解决办法
9872
查看次数

使用HibernateTemplate的findByNamedParam函数进行分页

我已经看到很多关于如何使用一些非常简单的查询创建分页的示例.但我没有看到任何使用HibernateTemplate的findByNamedParam方法.

如何在使用findByNamedParam方法的同时设置查询的firstResult和maxResult参数?

基本上,我正在尝试通过HibernateTemplate的findByNamedParam方法为我正在创建的hql查询添加分页.

java spring hibernate

3
推荐指数
1
解决办法
6709
查看次数