我正在尝试使用命令模式来允许我的Web层在单个事务的上下文中使用Hibernate实体(从而避免延迟加载异常).但是,我现在对如何处理交易感到困惑.
我的命令调用使用@Transactional注释注释的服务层方法.这些服务层方法中的@Transactional(readOnly=true)一些是只读的- 例如- 并且一些是读/写的.
我的服务层公开了一个命令处理程序,它执行代表Web层传递给它的命令.
@Transactional
public Command handle( Command cmd ) throws CommandException
Run Code Online (Sandbox Code Playgroud)
我假设我正确地使命令处理程序的handle()方法成为事务性的.这就是混乱的来源.如果命令的实现调用多个服务层方法,命令处理程序无法知道命令中调用的操作是只读,读/写还是组合两个.
我不明白传播在这个例子中是如何工作的.如果我要创建该handle()方法readOnly=true,那么如果该命令随后调用带有注释的服务层方法会发生什么@Transactional(realOnly=false)?
我希望更好地理解这一点并欢迎您的评论......
安德鲁
我一直在对Apache Shiro和Spring Security进行一些比较 - 我真的很喜欢Shiro使用的安全模型,并相信它比Spring Security更清晰.
但是,一个很好的方法是能够从方法级安全注释中引用方法参数.例如,现在我可以这样:
@RequiresPermissions("account:send:*")
public void sendEmail( EmailAccount account, String to, String subject, String message) { ... }
Run Code Online (Sandbox Code Playgroud)
在此示例的上下文中,这意味着经过身份验证的用户必须具有在电子邮件帐户上发送电子邮件的权限.
但是,这不是很细粒度,因为我想要实例级权限!在此上下文中,假设用户可以拥有电子邮件帐户实例的权限.所以,我想写一下这样的代码:
@RequiresPermissions("account:send:${account.id}")
public void sendEmail( EmailAccount account, String to, String subject, String message) { ... }
Run Code Online (Sandbox Code Playgroud)
通过这种方式,权限字符串引用传递给方法的参数,以便可以针对特定的EmailAccount实例保护该方法.
我知道我可以从方法中的普通Java代码轻松地做到这一点,但使用注释实现相同的东西会很棒 - 我知道Spring Security在其注释中支持Spring EL表达式.
这绝对不是Shiro的特色,因此我必须编写自己的自定义注释吗?
谢谢,
安德鲁
我正在努力理解Play的异步功能,但是在异步调用适合的地方发现了很多冲突,并且框架似乎与它的使用密谋.
我的例子涉及表单验证.Play允许定义临时约束 - 请参阅文档中的以下内容:
val loginForm = Form(
tuple(
"email" -> email,
"password" -> text
) verifying("Invalid user name or password", fields => fields match {
case (e, p) => User.authenticate(e,p).isDefined
})
)
Run Code Online (Sandbox Code Playgroud)
干净整洁.但是,如果我使用完全异步数据访问层(例如ReactiveMongo),这样的调用User.authenticate(...)将返回a Future,因此我在黑暗中如何利用内置表单绑定功能和异步工具.
宣传异步方法一切都很好,但我对框架的某些部分不能很好地发挥作用感到沮丧.如果验证必须同步进行,那么它似乎打败了异步方法.我在使用Action合成时遇到了类似的问题- 例如Action,与ReactiveMongo调用相关的安全性.
任何人都可以解释我的理解力不足的地方吗?
我正在使用Spring Security保护对网站的HTTP请求.主要用途是保护页面,以便在尝试访问这些页面时将用户重定向到登录页面.
但是,我还有一个要求.在我的模型中,我可以将用户的密码标记为临时密码,这样当他们成功登录时,应该自动强制他们更改密码.更改密码后,应将其转发到最初尝试访问的页面.
有没有人为此目的使用Spring Security?我是否需要创建自己的自定义过滤器?
谢谢,
安德鲁
我想尝试在事件采购应用程序中使用Cassandra作为事件存储.我对事件存储的要求非常简单.事件'schema'将是这样的:
我对卡珊德拉来说是全新的,所以请原谅我对我即将写的东西的无知.我只有两个我想要在这个数据上运行的查询.
我的想法是在CQL中创建一个Cassandra表,如下所示:
CREATE TABLE events (
id uuid,
seq_num int,
data text,
timestamp timestamp,
PRIMARY KEY (id, seq_num) );
Run Code Online (Sandbox Code Playgroud)
这似乎是一种模拟问题的明智方法吗?而且,重要的是,使用复合主键是否允许我有效地执行我指定的查询?请记住,给定用例,对于相同的聚合根id,可能存在大量事件(具有不同的seq_num).
我特别关注的是第二个查询在某种程度上效率低下(我在考虑二级索引......)
在使用Spring MVC构建RESTful Web服务时,我觉得在尝试组合Jackson JSON反序列化和JSR-303 bean验证时遇到了棘手的情况.
关于JSR-303验证的一个好处是,可以返回与目标对象关联的所有验证错误,而不是仅在第一个约束违规时失败(尽管如果要使用它,则存在失败快速模式).
想象一下你有一个JSON有效载荷的场景,例如:
{
"firstname": "Joe",
"surname": "Bloggs",
"age": 25
}
Run Code Online (Sandbox Code Playgroud)
然后你有想要映射到的对象:
public class Person {
@NotNull
private String firstname;
@NotNull
private String surname;
@Min(value = 0)
private int age;
...
}
Run Code Online (Sandbox Code Playgroud)
我对此设置的问题是,如果客户端发送一个字符串作为"年龄"的值,整个杰克逊反序列化过程将失败而不能专门针对它失败的原因(即我们永远不会得到验证) ).想象一下,这个有效载荷:
{
"age": "invalid"
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我想要返回的是"错误"响应,例如:
{
"errors" : [
"error": {
"field": "firstname",
"message": "Must not be null",
},
"error": {
"field": "surname",
"message": "Must not be null",
},
"error": {
"field": "age",
"message": "Must be numeric value greater than or equal …Run Code Online (Sandbox Code Playgroud) 我在服务层中使用Spring应用程序事件,以便在特定事件发生时通知更广泛的系统.我遇到的问题是事件是在事务上下文中触发的(我使用的是Spring的@Transactional注释).危险在于我触发事件然后事务在提交时失败(例如,在使用Hibernate时可能发生).在这种情况下,事件侦听器将假设某些状态,然后在执行后将回滚.这里的危险是,例如,我可能发送了一封电子邮件,以确认用户在网站上的注册,实际上,他们的用户帐户实际上并未创建.
是否有一种方法,保留注释的使用,标记事件提交后要触发的事件?它似乎有点类似于SwingUtilities.invokeLater(Runnable runnable)在Java Swing中进行GUI编程时的使用.我想说,一旦当前事务成功提交,稍后执行这段代码.
有任何想法吗?
谢谢,
安德鲁
在不离开RESTful范例的情况下,您如何以RESTful方式建模对象验证?最好解释一下我提出的理论用例......
想象一下,您的系统具有非常薄的Web层,可以调用后端RESTful服务.假设用户访问了注册表单并提交了它,Web层将直接将未经验证的数据发送到后端服务,如果服务以JSON格式响应验证错误,则可以将这些数据作为HTML发送回用户.
但是,想象一下我们希望在表单上有AJAX行为.例如,用户输入他们的电子邮件地址,我们想要使用AJAX进行验证,如果他们的电子邮件地址已经注册,则向用户发送错误.
实现单个调用来验证电子邮件地址是否有意义,还是可以在后端服务中发送和验证整个对象?如果是后者,您可以使用哪个URL来验证对象,而不是实际创建它?
作为Java EE开发人员,我使用了MDC(映射诊断上下文)方法来处理与请求相关的上下文数据,例如,用于跟踪请求中的许多潜在日志事件的唯一请求令牌.该请求的有效期.
鉴于它依赖于ThreadLocal,很明显这种方法在使用异步技术时会崩溃.
我还处于学习Scala的早期阶段,与此问题更相关的是Akka.我已经阅读了很多论坛帖子,证实了Akka和MDC的不兼容性,但尚未发现一种以某种方式模仿MDC方法的一致策略.
是否最好只是明确地传递这种数据作为在演员之间发送的消息的一部分?它有点脏,但同时兼容无法轻松扩展的能力.
除了直接通过消息之外,还有其他方法可以将上下文传递给Actor吗?此外,在使用Play 2.0 Async块时,有没有人遇到过同样的挑战?
我对使用Hibernate的Spring中的事务传播感到困惑.我@Transactional在服务层方法上使用Spring 注释.有些被标记为'只读=真'.如果我的一个只读服务方法调用的方法不是只读的,我该如何处理?
我想我可以标记所有读写方法以支持REQUIRES_NEW传播,但这会导致我可能不想要的行为 - 即在只读方法被称为读写的情况下我只想要一个新事务方法.如果读写方法调用另一个读写方法,我就不需要新的事务.
考虑到所有这些因素,我不明白Open Session In View(OSIV)是如何工作的!当然,在Spring中使用OSIV,OpenSessionInViewFilter必须在调用服务方法之前启动事务.在这种情况下,必须定义事务是只读还是读写.但是,怎么知道呢?它不知道在服务层的覆盖下会发生什么.
我对这一切都完全处于黑暗中,并希望有人向我解释它!
spring ×5
transactions ×3
asynchronous ×2
akka ×1
annotations ×1
cassandra ×1
hibernate ×1
jackson ×1
java ×1
json ×1
rest ×1
scala ×1
security ×1
shiro ×1
spring-mvc ×1