Java Jackson 2:仅在序列化时忽略瞬态场

Java Jackson 2:仅在序列化时忽略瞬态场,java,serialization,jackson2,Java,Serialization,Jackson2,我正在JAX-RS应用程序中使用Jackson v2,我正在试图弄清楚这是否可行 将ObjectMapper配置为使用瞬态修饰符删除字段,但仅在序列化期间 这里有一个DTO来说明我省略的用例getter和setter public class User { private String email; private transient String password; } 考虑到上述DTO,我希望有一个对象映射器 序列化时的密码字段,并在反序列化期间包含它 关于transien

我正在JAX-RS应用程序中使用Jackson v2,我正在试图弄清楚这是否可行 将ObjectMapper配置为使用瞬态修饰符删除字段,但仅在序列化期间

这里有一个DTO来说明我省略的用例getter和setter

public class User {
    private String email;
    private transient String password;
}
考虑到上述DTO,我希望有一个对象映射器 序列化时的密码字段,并在反序列化期间包含它

关于transient,我唯一能找到的是:

MapperFeature.PROPAGATE_TRANSIENT_MARKER
但是这个配置与我的需求无关

p.S-不使用注释,因为DTO不耦合到任何库,以及 我不一定能控制他们

不知道,看起来像是瞬态属性修饰符加上PROPAGATE_transient_标记就可以做到这一点。反序列化是直截了当的。不过,在序列化过程中会出现一些错误。您需要为字段提供getter,否则将遇到无法识别的异常字段。。。没有被标记为可忽略的

为了响应额外的需求,我添加了一个使用jackson mixins的版本。注意,mixin版本生成带有空密码字段的json,而PROPAGATE_TRANSIENT_MARKER版本根本不生成任何字段

传播\u瞬态\u标记版本

公共类序列化反序列化属性{ 私有最终对象映射器映射器=新对象映射器; public T fromJsonString json,类c抛出IOException{ 同步映射器{ mapper.configureMapperFeature.PROPAGATE\u TRANSIENT\u标记,false; 返回mapper.readValuejson,c; } } 公共字符串toJsonObject o引发JsonProcessingException{ 同步映射器{ mapper.configureMapperFeature.PROPAGATE_TRANSIENT_标记,true; 返回mapper.writeValueAsTringo; } } 私有静态最终字符串jsonFull={\name\:\A\,\email\:\a@a\,\password\:\a\,\width\:1、\height\:1}; 私有静态最终字符串jsonPartial={\name\:\A\,\email\:\a@a\,\宽度\:1,\高度\:1}; 私有静态最终用户=新用户A,a@a,a,1,1; @试验 public void序列化反序列化引发IOException{ assertEqualsuser,fromJsonjsonFull,User.class; assertEqualsjsonPartial,toJsonuser; assertEqualsuser,fromJsonjsonFull,User.class; assertEqualsjsonPartial,toJsonuser; } } 混音版本

公共类SerializeDeserializeAttributesMixin{ 公共抽象类UserMixin{ @JsonSerializeusing=PwdSerializer.class 临时字符串密码; } 静态类PwdSerializer扩展了stdsserializer{ 公用PWD串行化器{ thisString.class; } 私有PWD串行化类t{ 超级; } @凌驾 public void字符串序列化,JsonGenerator jg,SerializerProvider sp引发IOException{ jg.writeString; } } 私有静态最终字符串jsonFull={\name\:\A\,\email\:\a@a\,\password\:\a\,\width\:1、\height\:1}; 私有静态最终字符串jsonPartialMixin={\name\:\A\,\email\:\a@a\,\password\:\,\width\:1、\height\:1}; 私有静态最终用户=新用户A,a@a,a,1,1; 私有静态最终ObjectMapper Mappermxin=新ObjectMapper; 静止的{ mapermixin.addMixInUser.class,UserMixin.class; } @试验 public void SerializeUsingMixin引发IOException反序列化{ assertEqualsuser,MapPermxin.readValuejsonFull,User.class; assertEqualsjsonPartialMixin,mapperMixin.WriteValueAsTringuser; } } 这就是用户类

类用户{ 私有字符串名称; 私人字符串电子邮件; 私有临时字符串密码; 私有整数宽度; 私人内部高度; 公共用户{ } 用户字符串名称、字符串电子邮件、字符串密码、整数宽度、整数高度{ this.name=名称; this.email=电子邮件; this.password=密码; 这个。宽度=宽度; 高度=高度; } 公共字符串getName{ 返回名称; } 公共字符串getEmail{ 回复邮件; } 公共字符串getPassword{ 返回密码; } 公共整型getWidth{ 返回宽度; } 公共高度{ 返回高度; } @凌驾 公共布尔等式对象{ 如果此==o,则返回true; 如果o==null | | getClass!=o.getClass返回false; 用户=用户o; 返回Float.compareuser.width,width==0&& Float.compareuser.height,height==0&& Objects.equalsname、user.name&& Objects.equalsemail、user.email&& Objects.equalspassword、user.password; } @凌驾 公共整数哈希码{ 返回Objects.hashname、电子邮件、密码、宽度、高度; } @凌驾 公共字符串toString{ 返回用户{+ 名称='+name+'\+ ,email='+email+'\+ ,password='+password+'\+ ,宽度=+宽度+ ,高度=+高度+ '}'; } }
我不明白,如果不序列化属性A,那么如果包含它,A的反序列化会是什么我所指的用例与7年前的线程中的用例相同。我希望找到一个不涉及注释的解决方案。你所描述的听起来不像是链接的问题。此处接受的答案不使用注释进行序列化/反序列化。其中的注释有@Override、@SuppressWarnings和@Test。你没有回答我的问题。当我说的是一个带有字段email和password的传入JSON应该被构造成一个用户实例,并填充其电子邮件和密码-当将用户实例转换回JSON时,我希望不包含临时字段。同样的行为应该适用于任何类型,而不仅仅是用户。发布的代码工作的唯一原因是fromJson方法没有重复使用同一个objectMapper实例-我担心创建多个实例对我来说是不可行的。我想这确实回答了问题-但不是线程安全的:无论哪种方式,当与JAX-RS&一个ContextResolver提供者结合使用时,它仍然不可行。我会接受这一点,因为我的问题没有提到提到的要求。我添加了一个jackson mixin版本。