SpringREST应用程序中的Java静态/全局变量

SpringREST应用程序中的Java静态/全局变量,java,spring,rest,static,global-variables,Java,Spring,Rest,Static,Global Variables,我正在开发一个SpringREST服务Web应用程序,在该应用程序中,只要控制器中收到HTTP请求,我就会设置一个静态字符串变量null。在应用程序中,这个变量被不同的类和方法多次修改,最后作为rest服务响应返回 我担心这个静态字符串变量可能会被另一个并发HTTP请求更新,从而导致前一个请求中的值不正确 我不希望使用实例变量,因为它需要在整个应用程序中传递给多个方法(>30) 请建议一种方法来声明一个全局变量,该变量不会被任何并发HTTP请求更新,并且每个HTTP请求都有一个单独的副本。控制器

我正在开发一个SpringREST服务Web应用程序,在该应用程序中,只要控制器中收到HTTP请求,我就会设置一个
静态字符串
变量
null
。在应用程序中,这个变量被不同的类和方法多次修改,最后作为rest服务响应返回

我担心这个
静态字符串
变量可能会被另一个并发HTTP请求更新,从而导致前一个请求中的值不正确

我不希望使用实例变量,因为它需要在整个应用程序中传递给多个方法(>30)


请建议一种方法来声明一个全局变量,该变量不会被任何并发HTTP请求更新,并且每个HTTP请求都有一个单独的副本。

控制器有一个单例作用域,它不应该包含数据。如果需要将数据存储到应用程序,请使用包含数据字符串的bean的相应范围


如果您使用的是在其他用户之间共享的bean,那么应该保护数据不受并发修改的影响。目前,向用户提供保护的方式并不重要,但价格合理的数据结构简化了此类bean的实现。

您所有的验证方法都已经采用了一个参数,对吗?要验证的数据

它们还都需要生成验证消息并将其存储在某个位置,例如“结果收集器”中,对吗?所以这也应该是一个参数

旁注:将数据和结果收集器作为参数提供给验证器,允许您对验证器进行单元测试

我不认为将结果收集器传递给所有验证器有什么问题,就像传递要验证的数据一样。这是代码应该如何编写的开始

切勿在web应用程序中使用“全局”内存


纯粹从验证器的角度来看,您传入了要验证的数据,但希望结果写入静态收集器糟糕的设计,就在那里。验证器不应负责找出如何找到结果收集器。

您可以尝试使用
ThreadLocal
,但如果您需要将对象传递给30多个方法,则您的设计存在问题。静态全局变量不起作用是正确的。我正在创建一个XML文件验证程序应用程序,它有100多个唯一字段。有多种方法(>30)来验证不同类型的唯一XML标记。我在验证开始时获取一个静态StringBuilder对象,并在发生错误时不断更新该对象。最后,返回包含所有错误信息的StringBuilder对象。Java中没有全局变量。请澄清您的问题。是@EJP。我知道Java中没有全局变量。我正在寻找一个可以在我的场景中使用的替代方案。我不想使用实例变量,因为该变量需要经过30多个方法,而通过这么多方法不断传递一个变量是一项乏味的任务。那么,你为什么在标题和问题中提到它们呢?谈论不存在的东西是没有意义的。请修改。谢谢安德烈亚斯的建议。考虑使用实例变量更改设计。@在什么对象上使用实例变量?你的豆子?它们是单例的,所以实例变量也是单例的,而您什么也得不到。我将使用scope prototype创建一个bean,并将结果收集器放入其中。此外,使用查找方法将这个bean注入到我的单例控制器中。这种方法看起来好吗?为什么要使用bean呢。一个普通的Java类就可以了。控制器需要结果采集器,因为它需要了解结果,对吗?是的,这也会起作用。我可以在控制器方法中创建StringBuilder对象,并在应用程序中继续传递它以收集结果。