【问题标题】:Constructors should only call non-overridable methods in SonarQube tool构造函数只应在 SonarQube 工具中调用不可覆盖的方法
【发布时间】:2022-02-23 02:08:03
【问题描述】:

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

球衣配置

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 问题

【问题讨论】:

  • @SotiriosDelimanolis 这可能是误报,因为它是有效的球衣代码blog.dejavu.sk/registering-resources-and-providers-in-jersey-2
  • 是的,我正要添加另一个副本来抑制它。第一个正确解释了警告发生的原因。
  • 我有类似的代码,SonarLint 没有发现任何代码气味,您如何检查您的代码?
  • @user7294900 在环境中部署我的代码后,我们检查声纳问题并显示此问题
  • 我认为你应该在 SonarQube 网站上将其作为误报提出,或者至少在那里讨论

标签: java sonarqube


【解决方案1】:

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

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。我不知道泽西岛,所以你有以下选择:

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

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

当然,如果invalidateCache 不是private,那么你也必须添加它:

@Override
public final void invalidateCache() {
    super.invalidateCache()
}

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

  • 使用的框架(泽西)指南
  • 谁能扩展JerseyConfiguration配置

我认为在应用程序时也可以将其关闭为Won't Fix

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

【讨论】:

    【解决方案2】:

    在 register() 调用中添加一个显式的“this”。

    例子:

    public class JerseyConfiguration extends ResourceConfig {
    
      @Autowired
      public JerseyConfiguration() {
        this.register(TermsResourceImpl.class);
        this.register(AccessIDResourceImpl.class);
    
        ...
    
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-03-01
      • 2014-01-18
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 2014-05-22
      • 2011-03-25
      • 2022-11-13
      相关资源
      最近更新 更多