我有一个工作标准的Spring Boot/Hibernate多租户(模式)解决方案,但未能拦截/ oauth/token上的oauth令牌请求.
似乎HandlerInterceptor实例正在为任何请求调用,而不是那些指向我的令牌端点的实例.这是一个问题,因为我需要多租户.
因此,我需要一些在任何请求开始时调用的类,以从请求中提取租户信息,然后将其存储在某些ThreadLocal中.此外,我还需要一个在请求处理后调用的方法,以便从ThreadLocal中删除租户信息以确保安全.
我猜一个WebFilter是不够的,因为每个请求只会调用一次.并且没有为我的oauth端点调用任何MVC处理程序/拦截器,这些端点由spring boot auto配置配置并且似乎绕过mvc调用.
oauth资源是否可以被mvc处理程序拦截?除了使用RequestContextHolder之外,我的问题还有其他解决办法吗?
任何想法提示 - 提前感谢!格里特
在我们公司,我们正在开发在 wildfly 10.1 中运行的准标准 REST 服务。每个请求都拥有一个租户标头,该标头将被过滤器拦截,租户信息将存储在一个@RequestScopedbean 中,以供稍后在 rest 或服务层中使用。到现在为止还挺好。现在我们发现服务中的一些代码使用的是 Java 8 并行流,并且无法使用@RequestScopedbean 查找当前租户。我们对此进行了多次验证。使用非并行流为我们解决了这个问题。
这是正常行为吗?我们真的很困惑,使用标准的 Java 8 特性破坏了我们预期的容器行为。
还有其他这样的罪魁祸首我们需要照顾吗?
我很难理解如何解决这个问题,所以我在这里问它,希望其他人已经面临同样的问题。我们正在使用手动确认模式和死信恢复器运行@KafkaListener,重试限制为3。由于业务逻辑,我们不确认消息并在特定情况下暂停消费5分钟(外部依赖)。
此外,我们确实需要死信队列来存放由于某种原因无法处理的消息。
现在手动确认模式的问题是,当我们的监听器/消费者达到重试限制并将其移动到 dl 队列时,他不会确认该消息。
如果消费者服务重新启动,他会尝试一次又一次地消费消息,并将它们移至 dl 队列。
我们有什么想法可以解决这个问题吗?
来自汉堡的感谢和问候!
我想使用支持组件作为访问我的复合组件属性的层(在其界面中定义).我想要实现的是通过我的支持组件类读取我的组件的属性,其中我给出了提供的属性的属性值.
public String getName() {
if (this.name == null) {
this.name = getAttributes().get("name");
}
return this.name;
}
Run Code Online (Sandbox Code Playgroud)
但是当设置一个新值时,例如通过输入字段,我想仅将值存储在我的支持bean属性中,而不是将作为属性参数传递的原始属性的值更新到我的复合组件.
public void setName(final String name) {
this.name = name;
}
Run Code Online (Sandbox Code Playgroud)
我现在的问题是,当我第一次调用我的支持组件的getter时,或者在他生命的某个早期阶段,上面显示的getter代码会导致Stackoverflow异常,因为getAttributes.get("name")调用getter我的支持组件(本身)而不是提取提供给我的复合组件的属性/属性.有趣的部分是使用一个简单的getter只返回this.name而不是调用getAttributes()我可以在那里设置一个断点然后调用getAttributes.get("name")(通过调试器)结果不是溢出/调用它自己的getter但是而是返回提供给我的复合组件的属性.
我想它与背衬组件和复合组件之间的耦合有关.当第一次调用getter时,没有给出它们之间的耦合,因此getAttributes.get("name")的调用导致调用我的后备组件的getter,而后来调用不会调用它自己的getter而是获取提供给我的comp组件的属性.
任何人都知道如何解决这个问题?Thnx提前.
我们面临着一个奇怪的问题,我不明白发生了什么,并希望其他人已经遇到了同样的问题并知道发生了什么。
我们使用 @Cachable 编写了一个简单的 REST 服务:
@GetMapping(value = "/get/{" + PARAM_TENANT + "}/{" + PARAM_UID + "}")
@Cacheable(value = GET_ORDERS_BY_UID )
public GetOrdersResponseDto getOrdersByUid(@PathVariable final String tenant, @PathVariable final String uid) {
....
return new GetOrdersResponseDto(createCacheKey(), orderResponseDtos);
}
Run Code Online (Sandbox Code Playgroud)
GetOrdersResponseDto 由多个字段组成。有些包含自定义类的实例,有些包含自定义类的列表以及其他简单的原始值。
当从缓存提供 GetOrdersResponseDto 响应时,存储在列表内并且位于对象超类中的所有对象字段都将填充空值。
我们使用 hazelcast 作为缓存实现。我们的缓存配置非常基本:
@Component
public class HazelcastConfig extends Config {
@Autowired
public HazelcastConfig(final ConfigClient configClient) {
super();
final GroupConfig groupConfig = getGroupConfig();
final String name = configClient
.getConfigPropertyValueOrThrow("public", "com.orderservice.hazelcast.group.name");
groupConfig.setName("foogroup");
final String password = configClient
.getConfigPropertyValueOrThrow("public", "com.orderservice.hazelcast.group.password"); …Run Code Online (Sandbox Code Playgroud) 如何拥有MyException和MyRuntimeException使用相同的自定义getMessage()实现?
由于Java没有多重继承,我不知道该怎么做.目前我在这两个类中都有重复的代码......
重要细节:getMessage()像this.class.getName()这样的东西.所以我确实需要getMessage()使用反射,因为我需要对象的类名进行本地化.
所以要么我需要一个解决方案来解决我的第一个问题,要么解决如何在静态方法中使用反射的原因然后我可以使用一些两个例外都可以使用的实用程序类?
一个解决方案可能是某个帮助器类中的静态方法,然后使用它:
return new Object(){}.getClass().getEnclosingClass().getEnclosingClass();
不是吗?
java ×4
spring ×3
spring-boot ×2
exception ×1
hazelcast ×1
hibernate ×1
jakarta-ee ×1
java-8 ×1
jboss ×1
jsf ×1
jsf-2 ×1
multi-tenant ×1
spring-kafka ×1
spring-mvc ×1
wildfly ×1