Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 生成器模式反序列化,jackson不工作_Java_Design Patterns_Jackson_Builder - Fatal编程技术网

Java 生成器模式反序列化,jackson不工作

Java 生成器模式反序列化,jackson不工作,java,design-patterns,jackson,builder,Java,Design Patterns,Jackson,Builder,我尽力处理这个请求 { "city": "city", "date": "2020-08-26T12:15:54.428Z", "time": { "sum":"123" } } 我的目标是处理这个请求。诀窍是我尝试使用带有可选参数的构建器模式(根据有效的Java.joshuabloch)。据我所知,我不必发送所有的时间值。只需

我尽力处理这个请求

{
  "city": "city",
  "date": "2020-08-26T12:15:54.428Z",
  "time": {
      "sum":"123"
  }
}
我的目标是处理这个请求。诀窍是我尝试使用带有可选参数的构建器模式(根据有效的Java.joshuabloch)。据我所知,我不必发送所有的时间值。只需要一笔钱。 我试图通过邮递员将请求体内的运动对象发送给控制器

因此,我为我的运动创建了POJO课程:

@Entity
@Table(name = "sport")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Sport {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "date")
    private Date date;

    @Column(name = "city")
    private City city;

    @Type(type = "time")
    private Time time;
}
及 时间生成器:

package pl.project.model;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;

@JsonDeserialize(builder = Time.Builder.class)
public class Time {
    private final String bike;
    private final String run;
    private final String sum;

    private Time(Builder builder) {
        bike = builder.bike;
        run = builder.run;
        sum = builder.sum;

    }

    @JsonPOJOBuilder(withPrefix = "")
    public static class Builder {

        String bike = "-";
        String run = "-";
        final String sum;

        Builder(String sum) {
            this.sum = sum;
        }

        Builder bike(String bike) {
            this.bike = bike;
            return this;
        }

        Builder run(String run) {
            this.run = run;
            return this;
        }

        Time build() {
            return new Time(this);
        }

    }
}

但仍然会出现错误:

JSON parse error: Cannot construct instance of `pl.project.model.Time$Builder` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `pl.project.model.Time$Builder` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)\n at [Source: (PushbackInputStream); line: 14, column: 7] (through reference chain: pl.project.model.Sport[\"time\"])"
我尝试了许多stackoverflow解决方案,但都不适合我


有人能帮我吗?

这个
Builder
类必须有以属性命名的方法,和/或使用
@JsonProperty
来命名值

对构造函数参数使用
@JsonProperty

@JsonPOJOBuilder(带前缀=”“)
公共静态类生成器{
字符串bike=“-”;
字符串run=“-”;
最终字符串和;
生成器(@JsonProperty(“sum”)字符串sum){//必须显式命名该属性
this.sum=sum;
}
建筑自行车(弦式自行车){
这辆自行车=自行车;
归还这个;
}
生成器运行(字符串运行){
this.run=run;
归还这个;
}
时间构建(){
返回新时间(本次);
}
}
使用生成器“setter”方法

@JsonPOJOBuilder(带前缀=”“)
公共静态类生成器{
字符串bike=“-”;
字符串run=“-”;
字符串和;
生成器和(字符串和){//标准生成器“setter”方法
this.sum=sum;
归还这个;
}
@JsonProperty(“bike”)//必须显式指定非标准方法名称
建造商收进自行车(绳索自行车){
这辆自行车=自行车;
归还这个;
}
生成器运行(字符串运行){
this.run=run;
归还这个;
}
时间构建(){
if(this.sum==null)//需要在此处进行验证,因为属性是可选的
抛出新的IllegalStateException(“缺少必需的属性:sum”);
返回新时间(本次);
}
}

构建器
类必须具有以属性命名的方法,和/或使用
@JsonProperty
命名值

对构造函数参数使用
@JsonProperty

@JsonPOJOBuilder(带前缀=”“)
公共静态类生成器{
字符串bike=“-”;
字符串run=“-”;
最终字符串和;
生成器(@JsonProperty(“sum”)字符串sum){//必须显式命名该属性
this.sum=sum;
}
建筑自行车(弦式自行车){
这辆自行车=自行车;
归还这个;
}
生成器运行(字符串运行){
this.run=run;
归还这个;
}
时间构建(){
返回新时间(本次);
}
}
使用生成器“setter”方法

@JsonPOJOBuilder(带前缀=”“)
公共静态类生成器{
字符串bike=“-”;
字符串run=“-”;
字符串和;
生成器和(字符串和){//标准生成器“setter”方法
this.sum=sum;
归还这个;
}
@JsonProperty(“bike”)//必须显式指定非标准方法名称
建造商收进自行车(绳索自行车){
这辆自行车=自行车;
归还这个;
}
生成器运行(字符串运行){
this.run=run;
归还这个;
}
时间构建(){
if(this.sum==null)//需要在此处进行验证,因为属性是可选的
抛出新的IllegalStateException(“缺少必需的属性:sum”);
返回新时间(本次);
}
}

除此之外,
@Getter
时间
class@PratapiHemantPatel它没有丢失。Jackson将识别
build()
方法,因为它是一个无参数方法,返回类型与使用
Builder
类的类相匹配,即带有
@JsonDeserialize(Builder=Time.Builder.class)的类
注释。除此之外,
@Getter
时间
class@PratapiHemantPatel它没有丢失。Jackson将识别
build()
方法,因为它是一个无参数方法,返回类型与使用
Builder
类的类相匹配,即带有
@JsonDeserialize(Builder=Time.Builder.class)
注释的类。