我正在使用 Spring 的@EnableAsync功能来异步执行方法。为了安全起见,我使用 Apache Shiro。在异步执行的代码中,我需要访问附加到触发异步调用的线程的 Shiro 主题。
Shiro 支持在不同线程中使用现有主题,方法是将主题与Callable要在不同线程上执行的主题相关联(请参阅此处):
Subject.associateWith(Callable)
Run Code Online (Sandbox Code Playgroud)
不幸的是我无法直接访问Callable这些东西,因为这些东西是由 Spring 封装的。我发现我需要扩展 SpringAnnotationAsyncExecutionInterceptor来将我的主题与创建的主题相关联Callable(这是简单的部分)。
现在的问题是如何让 Spring 使用我的自定义AnnotationAsyncExecutionInterceptor而不是默认的。默认值是在AsyncAnnotationAdvisor和中创建的AsyncAnnotationBeanPostProcessor。我当然也可以扩展这些类,但这只会转变为问题,因为我需要让 Spring 再次使用我的扩展类。
有什么办法可以实现我想要的吗?
我也可以添加一个新的自定义异步注释。但我认为这不会有太大帮助。
更新:AnnotationAsyncExecutionInterceptor实际上我需要定制的
发现是错误的。一次偶然的机会,我偶然发现org.apache.shiro.concurrent.SubjectAwareExecutorService它完全符合我的要求,并让我觉得我可以简单地提供一个自定义执行器,而不是自定义拦截器。详情请参阅我的回答。
我正在尝试添加ArrayList到List。getSalesOrderitm()是Salesorder项目列表。
Criteria cr = session.createCriteria(SalesOrder.class);
cr.add(Restrictions.ge("date", new SimpleDateFormat("yyyy/MM/dd").parse(fdate)));
cr.add(Restrictions.le("date", new SimpleDateFormat("yyyy/MM/dd").parse(tdate)));
List<SalesOrder> orderList = cr.list();
List<SalesOrderItem> itemList = Collections.EMPTY_LIST;
double totalAmount = 0.00;
for (SalesOrder salesOrder : orderList) {
itemList.addAll(salesOrder.getSalesorderyitm());
}
Run Code Online (Sandbox Code Playgroud)
下面您可以在Salesorder类中看到休眠映射
@OneToMany(targetEntity=SalesOrderItem.class,mappedBy="salesorder",fetch=FetchType.LAZY)
public List<SalesOrderItem> getSalesorderyitm() {
return salesorderyitm;
}
public void setSalesorderyitm(List<SalesOrderItem> salesorderyitm) {
this.salesorderyitm = salesorderyitm;
}
Run Code Online (Sandbox Code Playgroud)
在下面您可以看到salesOrderItem类中的休眠映射
@ManyToOne
@JoinColumn(name="SOI_SalesOrderId")
public SalesOrder getSalesorder() {
return salesorder;
}
public void setSalesorder(SalesOrder salesorder) {
this.salesorder = salesorder;
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108) …Run Code Online (Sandbox Code Playgroud) 我有两个清单;
val keys: List<String> = listOf("key1", "key2", "key3"...)
val values: List<String> = listOf("value1", "value2", "value3"...)
Run Code Online (Sandbox Code Playgroud)
我怎样才能将它们合二为一List<Hashmap<Key,Value>>?喜欢;
println(List<Hashmap<Key,Value>>): [[key1 = value1], [key2 = value2], [key3 = value3]...
在尝试从字符串中检索星期几时,虽然字符串对应于预定义格式,但有时会发生错误.
下面是用于解析字符串和格式定义的函数:
val dateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
def getDayOfWeek(date: String): Int = {
val stringToParse = date.substring(0, 19)
try {
val now = Calendar.getInstance()
now.setTime(dateFormat.parse(stringToParse))
println("Correct time string: " + stringToParse)
now.get(Calendar.DAY_OF_WEEK)
} catch {
case _: Throwable => println("Wrong time string: " + stringToParse)
-1
}
}
Run Code Online (Sandbox Code Playgroud)
以下是成功/未成功解析的字符串的示例:
Correct time string: 2017-01-01 04:00:00
Wrong time string: 2017-05-04 15:00:00
Correct time string: 2017-01-01 04:00:00
Correct time string: 2017-06-13 07:00:00
Correct time string: 2017-05-04 15:00:00
Correct time string: 2017-01-01 04:00:00 …Run Code Online (Sandbox Code Playgroud) java ×3
arraylist ×1
asynchronous ×1
collectors ×1
dictionary ×1
kotlin ×1
list ×1
scala ×1
shiro ×1
spring ×1