gpt4 book ai didi

java - 构造函数应该只调用 SonarQube 工具中不可重写的方法

转载 作者:行者123 更新时间:2023-12-01 16:14:03 25 4
gpt4 key购买 nike

JersyConfiguration类中,我遇到了 Sonar 工具的主要问题,例如从构造函数中删除对可重写“注册”方法的调用。我真的不明白通过什么代码更改可以解决这个问题。这是我的代码:

泽西配置

public class JerseyConfiguration extends ResourceConfig {

@Bean
@Primary
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
objectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
return objectMapper;
}



@Autowired
public JerseyConfiguration() {
register(TermsResourceImpl.class);
register(AccessIDResourceImpl.class);
register(CatalogResourceImpl.class);
register(SubmitOrderResourceImpl.class);
register(ValidateAndQuoteResourceImp.class);
property(ServletProperties.FILTER_FORWARD_ON_404, true);
register(DynamicLoggingFeature.class);
register(ContextFilter.class);
register(ServiceExceptionMapper.class);
register(JsonParseExceptionMapper.class, 1);
register(JsonMappingExceptionMapper.class, 1);
register(LoggingContextJerseyFilter.class);
register(FeatureToggleFilterBinder.class);
}

@Bean
public Client jerseyClient() {
return ClientBuilder.newClient(new ClientConfig());
}
}

ResourceConfig 重写方法

 @Override
public ResourceConfig property(final String name, final Object value) {
state.property(name, value);
return this;
}

@Override
public ResourceConfig register(final Class<?> componentClass) {
invalidateCache();
state.register(componentClass);
return this;
}

SonarQube 问题

SonarQube issue description

最佳答案

这不是误报,因为该规则运行正常。您正在构造函数中调用一个可以在子类中更改的方法。这种结构可能会导致问题。示例:

public class BrokenCode extends JerseyConfiguration {

@Override
public ResourceConfig register(final Class<?> componentClass) {
// stop invaliding cache, to break the application
// invalidateCache();

state.register(componentClass);
return this;
}
}
<小时/>

要解决该问题,该方法必须标记为final。我不了解 Jersey ,所以您有以下选择:

1。如果不可能将方法设置为final

在某些情况下,添加 final 可能会破坏应用程序,因为例如动态代理是由所使用的框架创建的。在这种情况下,您只能将问题标记为Won't Fix(它通知其他开发人员提到的结构与规则不匹配,但您可以接受)

2。是否可以将方法设置为final

有两个选项,具体取决于您可以编辑的类:

  1. 如果您可以编辑 ResourceConfig 类,则更改:
@Override
public ResourceConfig register(final Class<?> componentClass) {
invalidateCache();
state.register(componentClass);
return this;
}

@Override
public final ResourceConfig register(final Class<?> componentClass) {
invalidateCache();
state.register(componentClass);
return this;
}

如果 invalidateCache 不是 private,那么您也必须将其标记为 final

  • 如果您无法编辑 ResourceConfig 类,则可以向 JerseyConfiguration 类添加以下方法:
  • @Override
    public final ResourceConfig register(final Class<?> componentClass) {
    super.register(componentClass)
    }

    当然,如果invalidateCache不是私有(private),那么您也必须添加它:

    @Override
    public final void invalidateCache() {
    super.invalidateCache()
    }
    <小时/>

    所选择的“修复”策略还应基于:

    • 使用的框架( Jersey )指南
    • 谁可以扩展 JerseyConfiguration 配置
    • 等等

    我认为关闭它是完全可以的,因为不会修复也适用于应用程序:

    • 使用所用框架文档中的结构
    • 仅由您的团队开发/维护(没有其他人手动创建 JerseyConfiguration 类的新实例)

    关于java - 构造函数应该只调用 SonarQube 工具中不可重写的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62449994/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com