Java Spring自定义请求上下文

Java Spring自定义请求上下文,java,spring,spring-mvc,Java,Spring,Spring Mvc,Spring提供的作用域之一是请求,其中的bean仅在请求上下文中有效 该请求通常在HTTP请求之后委托给控制器,Spring已经设置了所有必要的内容 但是,如果请求来自不同的源,例如Java消息服务,该怎么办 是否可以为消息的每次处理设置请求范围 我可以用一些东西来注释一个方法以将其标记为请求范围的边界吗?在封面下,Spring只调用RequestContextHolder,以便在处理HTTP请求时在开始时将RequestAttributes设置为ThreadLocal,并在线程完成处理请求之

Spring提供的作用域之一是请求,其中的bean仅在请求上下文中有效

该请求通常在HTTP请求之后委托给控制器,Spring已经设置了所有必要的内容

但是,如果请求来自不同的源,例如Java消息服务,该怎么办

是否可以为消息的每次处理设置请求范围


我可以用一些东西来注释一个方法以将其标记为请求范围的边界吗?

在封面下,Spring只调用RequestContextHolder,以便在处理HTTP请求时在开始时将RequestAttributes设置为ThreadLocal,并在线程完成处理请求之前将其从ThreadLocal中删除。请求和会话范围bean实际上存储在这个RequestAttributes中并从中获取

在正常的web环境中,此RequestAttributes实现由HttpServletRequest支持。但是,在非web上下文中,没有HttpServletRequest,因此不能使用现有的实现。其中一种方法是实现由内部映射支持的RequestAttributes:

MemoryRequestAttribute中的公共类扩展了AbstractRequestAttribute{ 受保护的映射属性=新HashMap; @凌驾 公共对象getAttributeString名称,int范围{ 返回attributes.getname; } @凌驾 public void setAttributeString名称、对象值、int范围{ attributes.putname、value; } @凌驾 public void removeAttributeString名称,int作用域{ attributes.removename; } @凌驾 公共字符串[]GetAttributeNameSite作用域{ String[]结果=新字符串[attributes.keySet.size]; attributes.keySet.toArrayresult; 返回结果; } @凌驾 public void registerDestructionCallbackString名称,可运行回调,int范围{ 已同步此.requestDestructionCallbacks{ this.requestDestructionCallbacks.putname,回调; } } @凌驾 公共对象resolveReferenceString键{ 返回属性; } @凌驾 公共字符串getSessionId{ 返回null; } @凌驾 公共对象getSessionMutex{ 返回null; } @凌驾 受保护的void updateAccessedSessionAttribute{ } } 注意:它只适用于请求范围bean。如果您也想支持会话范围bean,请修改它

然后在完成JMS消息处理之前,将其设置并从ThreadLocal中删除,例如:

公共无效接收字符串消息{ RequestContextHolder.setRequestAttributesnew In MemoryRequestAttribute; fooBean.processMessagemessage; RequestContextHolder.resetRequestAttributes; }
在封面下,Spring只是在处理HTTP请求时调用RequestContextHolder在开始时将RequestAttributes设置为ThreadLocal,并在线程完成处理请求之前将其从ThreadLocal中删除。请求和会话范围bean实际上存储在这个RequestAttributes中并从中获取

在正常的web环境中,此RequestAttributes实现由HttpServletRequest支持。但是,在非web上下文中,没有HttpServletRequest,因此不能使用现有的实现。其中一种方法是实现由内部映射支持的RequestAttributes:

MemoryRequestAttribute中的公共类扩展了AbstractRequestAttribute{ 受保护的映射属性=新HashMap; @凌驾 公共对象getAttributeString名称,int范围{ 返回attributes.getname; } @凌驾 public void setAttributeString名称、对象值、int范围{ attributes.putname、value; } @凌驾 public void removeAttributeString名称,int作用域{ attributes.removename; } @凌驾 公共字符串[]GetAttributeNameSite作用域{ String[]结果=新字符串[attributes.keySet.size]; attributes.keySet.toArrayresult; 返回结果; } @凌驾 public void registerDestructionCallbackString名称,可运行回调,int范围{ 已同步此.requestDestructionCallbacks{ this.requestDestructionCallbacks.putname,回调; } } @凌驾 公共对象resolveReferenceString键{ 返回属性; } @凌驾 公共字符串getSessionId{ 返回null; } @凌驾 公共对象getSessionMutex{ 返回null; } @凌驾 受保护的void updateAccessedSessionAttribute{ } } 注意:它只适用于请求范围bean。如果您也想支持会话范围bean,请修改它

然后在完成JMS消息处理之前,将其设置并从ThreadLocal中删除,例如:

公共无效接收字符串消息{ RequestContextHolder.setRequestAttributesnew In MemoryRequestAttribute; fooBean.processMessagemessage; RequestContextHolder.resetRequestAttributes; }
我查看了AbstractRequestAttributes,它已经定义了registerDestructionCallback。有没有重新定义它的理由?是的。你是对的。不需要重新定义它,只要使用它。已经更新了关于这个问题的答案,我看了AbstractRequestAttributes,它已经定义了registerDestructionCallback。有没有重新定义它的理由?是的。你是对的。不需要重新定义它,只要使用它。已经更新了答案