Java Jackson 2:仅在序列化时忽略瞬态场
我正在JAX-RS应用程序中使用Jackson v2,我正在试图弄清楚这是否可行 将ObjectMapper配置为使用瞬态修饰符删除字段,但仅在序列化期间 这里有一个DTO来说明我省略的用例getter和setterJava 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
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版本。