在Java中的自定义异常中序列化字段

Posted

技术标签:

【中文标题】在Java中的自定义异常中序列化字段【英文标题】:Serialize fields in custom exception in Java 【发布时间】:2018-07-03 08:56:07 【问题描述】:

假设我有我的自定义RuntimeException,其中MyEntity 是JPA @Entity

@Getter
public class MyEntityAlreadyExistingException extends RuntimeException 

    private final MyEntity myEntity;

    public MyEntityAlreadyExistingException(MyEntity myEntity) 
        super(MessageFormat.format("MyEntity with name \"0\" already exists", myEntity.getName()));
        this.myEntity = myEntity;
    

Sonar 提示我将 myEntity 设为瞬态或可序列化。

我应该如何处理这种情况?

我不使用任何 RMI,任何远程处理。这是一个相对简单的带有 JPA 的 Spring Boot Web 应用程序。

如果我使myEntity 可序列化,我以后可以利用哪些优势?

【问题讨论】:

你在实现序列化接口方面没有任何缺点,但唯一的问题是瞬态,因为当从请求方法返回响应时,实体类将被序列化。 ***.com/questions/7683739/… 【参考方案1】:

我应该如何处理这种情况?

因此,如果您不使用任何 RMI 并且您的应用程序在受保护的环境中运行(并且您想让 Sonar 满意)- 将自定义异常类中的所有字段标记为瞬态,或保持原样。

如果我们谈论的是分布式环境,那么序列化应该非常小心——你的类一旦被序列化就必须具有可预测的行为。在这种情况下,将实例字段设置为对象 Serializable 的逻辑状态的一部分,否则 - 将它们标记为瞬态。

附:为什么声纳warns你。

【讨论】:

以上是关于在Java中的自定义异常中序列化字段的主要内容,如果未能解决你的问题,请参考以下文章

Java:简述Java中的自定义异常

为 Java 中的自定义检查异常编写 JUnit 测试用例?

为 Jackson 自定义反序列化程序抛出带有 HTTP 状态代码的自定义异常

如何使具有多个 init args 的自定义异常类可腌制

java编程实现自定义异常判断一个手机号码的合法性

PCL 文件中的自定义异常