- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
尝试将 @JsonCreator
与 @JsonProperty(value = "version", access = JsonProperty.Access.READ_ONLY) 一起使用时遇到 InvalidDefinitionException
这就是我的类(class)的样子:
@Entity
public class Example1 implements Serializable {
private String field1;
private int field2;
private Example2 field3;
public Example1(@JsonProperty(value = "field_1", access = JsonProperty.Access.READ_WRITE) String field1,
@JsonProperty(value = "field_2", access = JsonProperty.Access.READ_ONLY) int field2,
@JsonProperty(value = "field_3_1", access = JsonProperty.Access.READ_WRITE) String field31,
@JsonProperty(value = "field_3_2", access = JsonProperty.Access.READ_WRITE) int field32
) {
this.field1 = field1;
this.field2 = field2;
this.field3 = new Example2(field31, field32);
}
// getters and setters omitted
}
它抛出以下异常:
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Argument #1 of constructor [constructor for com.test.example.model.Example1, annotations: {interface com.fasterxml.jackson.annotation.JsonCreator=@com.fasterxml.jackson.annotation.JsonCreator(mode=DEFAULT)}] has no property name annotation; must have name when multiple-parameter constructor annotated as Creator
at [Source: (File); line: 1, column: 1]
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:62) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:249) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:165) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:411) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:349) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:477) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:4145) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3995) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2878) ~[jackson-databind-2.9.0.pr3.jar:2.9.0.pr3]
我的环境详细信息:我使用的是 Spring Boot 2.0.0.M2
版本和 Jackson 2.9.0.pr3
。
我的目的是在反序列化期间省略field2。
我尝试在field2的setter方法中使用@JsonIgnore
作为替代。甚至,它不适用于 @JsonCreator
。
最佳答案
反序列化时有两种方法可以忽略该属性
只需向您不想反序列化的属性添加注释
@JsonProperty(access = Access.READ_ONLY)
private String readOnly;
这个方法要小心,你应该把@JsonIgnore放在setter之前,把@JsonProperty放在getter之前。并且属性应该清晰,没有任何注释。
@JsonProperty
public String getJsonIgnoreSetter() {
return jsonIgnoreSetter;
}
@JsonIgnore
public void setJsonIgnoreSetter(String jsonIgnoreSetter) {
this.jsonIgnoreSetter = jsonIgnoreSetter;
}
最后是@JsonIgnore、@JsonProperty、@JsonProperty(access = xxx)的完整注解示例。
bean的定义
public class MockBean{
public MockBean() {
super(MockBean.class);
}
public MockBean(String attr1, String ignore, String jsonIgnore, String jsonIgnoreGetter,
String jsonIgnoreSetter, String jsonIgnoreProperties, String jsonIgnorePropertiesSetter,
String jsonIgnorePropertiesGetter, String readOnly, String writeOnly) {
super(MockBean.class);
this.attr1 = attr1;
this.ignore = ignore;
this.jsonIgnore = jsonIgnore;
this.jsonIgnoreGetter = jsonIgnoreGetter;
this.jsonIgnoreSetter = jsonIgnoreSetter;
this.jsonIgnoreProperties = jsonIgnoreProperties;
this.jsonIgnorePropertiesSetter = jsonIgnorePropertiesSetter;
this.jsonIgnorePropertiesGetter = jsonIgnorePropertiesGetter;
this.readOnly = readOnly;
this.writeOnly = writeOnly;
}
public String getAttr1() {
return attr1;
}
public void setAttr1(String name) {
this.attr1 = name;
}
public String getIgnore() {
return ignore;
}
public void setIgnore(String ignore) {
this.ignore = ignore;
}
public String getJsonIgnore() {
return jsonIgnore;
}
public void setJsonIgnore(String jsonIgnore) {
this.jsonIgnore = jsonIgnore;
}
@JsonIgnore
public String getJsonIgnoreGetter() {
return jsonIgnoreGetter;
}
@JsonProperty
public void setJsonIgnoreGetter(String jsonIgnoreGetter) {
this.jsonIgnoreGetter = jsonIgnoreGetter;
}
@JsonProperty
public String getJsonIgnoreSetter() {
return jsonIgnoreSetter;
}
@JsonIgnore
public void setJsonIgnoreSetter(String jsonIgnoreSetter) {
this.jsonIgnoreSetter = jsonIgnoreSetter;
}
public String getJsonIgnoreProperties() {
return jsonIgnoreProperties;
}
public void setJsonIgnoreProperties(String jsonIgnoreProperties) {
this.jsonIgnoreProperties = jsonIgnoreProperties;
}
public String getJsonIgnorePropertiesSetter() {
return jsonIgnorePropertiesSetter;
}
@JsonIgnoreProperties
public void setJsonIgnorePropertiesSetter(String jsonIgnorePropertiesSetter) {
this.jsonIgnorePropertiesSetter = jsonIgnorePropertiesSetter;
}
@JsonIgnoreProperties
public String getJsonIgnorePropertiesGetter() {
return jsonIgnorePropertiesGetter;
}
public void setJsonIgnorePropertiesGetter(String jsonIgnorePropertiesGetter) {
this.jsonIgnorePropertiesGetter = jsonIgnorePropertiesGetter;
}
public String getReadOnly() {
return readOnly;
}
public void setReadOnly(String readOnly) {
this.readOnly = readOnly;
}
public String getWriteOnly() {
return writeOnly;
}
public void setWriteOnly(String writeOnly) {
this.writeOnly = writeOnly;
}
private String attr1;
@Ignore
private String ignore;
@JsonIgnore
private String jsonIgnore;
@JsonIgnore
private String jsonIgnoreGetter;
@JsonIgnore
private String jsonIgnoreSetter;
@JsonIgnoreProperties
private String jsonIgnoreProperties;
private String jsonIgnorePropertiesSetter;
private String jsonIgnorePropertiesGetter;
@JsonProperty(access = Access.READ_ONLY)
private String readOnly;
@JsonProperty(access = Access.WRITE_ONLY)
private String writeOnly;
}
测试 JSON
{
"name": "name",
"description": "description",
"attr1":"attr1",
"ignore": "ignore",
"jsonIgnore": "jsonIgnore",
"jsonIgnoreGetter": "jsonIgnoreGetter",
"jsonIgnoreSetter": "jsonIgnoreSetter",
"jsonIgnoreProperties": "jsonIgnoreProperties",
"jsonIgnorePropertiesSetter": "jsonIgnorePropertiesSetter",
"jsonIgnorePropertiesGetter": "jsonIgnorePropertiesGetter",
"readOnly": "readOnly",
"writeOnly": "writeOnly"
}
反序列化结果:如果值为null,则不反序列化。
关于java - 将 JsonCreator 与 JsonProperty.Access.READ_ONLY 结合使用时出现 InvalidDefinitionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44854799/
在 spring boot 2.2.2、java 11 中,通过 Ibm mq 接收对象。 接收到的对象具有 LocalDate 数据类型。 项目在 maven 中有 spring-boot-star
我有几个 Kotlin 数据类实现了这个 TypeAlias 接口(interface): import com.fasterxml.jackson.annotation.JsonValue; pub
我正在尝试使用 spring-boot 和 webclient 调用 Web API。 web api 是 graph ql 的。所以我使用 JsonObject 传递参数,如下所示。 JSONObj
我正在尝试使用 Jackson 的 ObjectMapper 将以下 Player 对象编写为字符串。 package models.Game; import models.Game.Enums.Sn
在我在Spring Boot中构建的REST端点中,我试图将vehicleDTO传递给 Controller 。但是在到达我的 Controller 之前,有一个错误。 InvalidDefini
我正在使用 Jackson 将以下 json 映射到 Map : { "keyA": "java.lang.Double", "keyB": "[Ljava.lang.Doub
我从 API 获得了一个 Json 字符串,并希望将其解析为 Kotlin 对象。 我的杰森: { "Title": "The Secret Life of Walter Mitty", "Y
出现错误, com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class c
尝试将 @JsonCreator 与 @JsonProperty(value = "version", access = JsonProperty.Access.READ_ONLY) 一起使用时遇到
我已经更新了我的依赖,就像你在评论中所说的那样,我现在有了这个: org.springframework.context.ApplicationContextException: Unable to
我有一些实体:用户、角色、权限。对于所有三个实体,我有三个操作,然后将它们公开为 REST api。 findOne()、findAll() 和 create()。问题是: 角色:所有三个操作都有效。
我在执行以下代码时收到com.fasterxml.jackson.databind.exc.InvalidDefinitionException:没有为ObjectReader配置值类型问题 jack
存储在 Elastic 中的员工的生日似乎存储为不正确的数据类型。我有 Elasticseach 客户端的设置代码,带有对象映射器和注册的 JavaTime 模块。我正在尝试从 Elasticsear
在我的 Java 8 代码中,我尝试将字符串日期格式化为 LocalDate 格式。我正在使用 LocalDateDeserializer.class。我收到错误 com.fasterxml.jack
我有一个带有以下假客户的项目 @FeignClient(name = "name", url = "${tokenService}") public interface TokenService {
我目前正在尝试将 JSON 请求直接映射到 XML 定义。我的想法是,我有一个使用 SOAP 服务并将其公开为 RESTful 服务的 Spring Boot 应用程序; 下面是 SOAP 绑定(bi
我正在尝试从 spring boot Controller 访问上传的文件,但出现错误 com.fasterxml.jackson.databind.exc.InvalidDefinitionExce
我已经通过链接:JSON parse error: Can not construct instance of java.time.LocalDate: no String-argument cons
我是一名优秀的程序员,十分优秀!