0

我正面临Error: java: USFW_UNSYNCHRONIZED_SINGLETON_FIELD_WRITESsetter 方法的构建失败。它是由spotbugs 报告的。如何解决这个问题请帮助,因为没有得到解决方案。下面是 MySuperServiceConfig 类。

@Component
@ConfigurationProperties("mysuperservice")
@PropertySource("classpath:data.properties")
public class MySuperServiceConfig {
  private String username;
  private String password;
  private List<String> schemadata;

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }

  public List<String> getSchemadata() {
    return schemadata;
  }

  public void setSchemadata(List<String> schemadata) {
    this.schemadata = schemadata;
  }
}

下面是日志

[INFO] --- spotbugs-maven-plugin:3.1.12.2:check (default) @ aif-handler ---
[INFO] BugInstance size is 3
[INFO] Error size is 0
[INFO] Total bugs: 3
[ERROR] Method com.test.service.fileparser.MySuperServiceConfig.setPassword(String) of Singleton class writes to a field in an unsynchronized manner [com.amex.scs.aif.service.fileparser.MySuperServiceConfig] At MySuperServiceConfig.java:[line 29] USFW_UNSYNCHRONIZED_SINGLETON_FIELD_WRITES
[ERROR] Method com.test.service.fileparser.MySuperServiceConfig.setSchemadata(List) of Singleton class writes to a field in an unsynchronized manner [com.amex.scs.aif.service.fileparser.MySuperServiceConfig] At MySuperServiceConfig.java:[line 37] USFW_UNSYNCHRONIZED_SINGLETON_FIELD_WRITES
[ERROR] Method com.test.service.fileparser.MySuperServiceConfig.setUsername(String) of Singleton class writes to a field in an unsynchronized manner [com.amex.scs.aif.service.fileparser.MySuperServiceConfig] At MySuperServiceConfig.java:[line 21] USFW_UNSYNCHRONIZED_SINGLETON_FIELD_WRITES
4

1 回答 1

1

spotbug 文档包含有关此错误的一些信息

http://fb-contrib.sourceforge.net/bugdescriptions.html

USFW_UNSYNCHRONIZED_SINGLETON_FIELD_WRITES

此方法写入此类的字段。由于此类被视为单例,因此可能会产生竞争条件,或导致对其他线程的不可见更改,因为该字段不是同步访问的。

由于 Configuration Property 类标有 Component 注释,因此 Spotbug 会知道这是一个 Singleton Bean。Configuration bean 不会自动装配任何字段 - 用户名/密码/schemaData,但它有一个 getter 和 setter 方法。因此,看起来 bean 的这些实例属性或依赖项可能会被代码多次更改。在这种情况下,可能会出现竞争条件,因为方法不同步。因此,修复应该是删除此 Component 注释,因为这是一个配置属性映射器类。

要让它自动连线,您可以 -

  1. 在 SpringBootApplication 类或其他配置类上使用 @EnableConfigurationProperties(MySuperServiceConfig.class)
  2. 将此标记为 @Configuration 类
于 2020-07-26T13:08:07.470 回答