【问题标题】:sonarQube - make field transient or serializablesonarQube - 使字段瞬态或可序列化
【发布时间】:2016-07-01 06:56:17
【问题描述】:

我正在尝试解决由 Jenkins 的 sonarQube 插件报告的以下违规行为:“使‘更新’瞬态或可序列化。”。重力:关键,标签:序列化。

我有以下共享界面

public interface MPUpdate {

    void apply( SoapService svc, byte[] jerseyClientResp ) throws MPException ;
}

以下枚举是应用程序逻辑的入口点

public enum DomainResource implements MPUpdate {

    PROGRAMMES( new ProgrammeUpdate() ),
    PRODUCTIONS( new ProductionUpdate() );
    // more enums

    private DomainResource( MPUpdate update ) {
        this.update = update;
    }

    private final MPUpdate update; // Sonar: make "update" transient or serializable, priority: critical, tag: serialization

    @Override
    public void apply( SoapService svc, byte[] jerseyClientResp ) throws MPException {
        update.apply( svc, jerseyClientResp );      
    }
}

通过枚举初始化的逻辑单元之一

public class ProgrammeUpdate implements MPUpdate {

    private final ResponseConverter<ProgrammeDto> responseConverter = new ResponseConverter<>( ProgrammeDto.class );

    @Override
    public void apply( SoapService svc, byte[] jerseyClientResp ) throws MPException {

        // APPLICATION LOGIC
    }

}

最后是这样使用的:

...
String levelFromUrl = getLevel(); // eg. "programmes"
MPUpdate resource;
resource = DomainResource.valueOf( levelFromUrl.toUpperCase() ); 
...
resource.apply( soapService, jerseyClientOutcome );
...

有什么帮助吗?使用枚举会提高日志记录的性能吗?

非常感谢

【问题讨论】:

标签: java serialization sonarqube


【解决方案1】:

您不需要它是可序列化的。您应该将其标记为瞬态。枚举使用简单的名称字符串进行序列化,因此其他字段无关紧要。只需将该字段标记为瞬态以使声纳满意(尽管该工具本身应该确实能够识别这种情况)。

【讨论】:

  • 谢谢。我决定按照你的建议做。或者,我还必须向接口添加“扩展 Serializable”,并在实现该接口的每个类上添加一个字段“serialVersionUID”。
  • 我已经在类中实现了可序列化的接口,即使这样我也得到了这个错误。
猜你喜欢
  • 2019-02-08
  • 2020-02-18
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 2016-12-12
  • 2012-07-05
  • 1970-01-01
相关资源
最近更新 更多