如何使用构建器模式通过表单创建对象?

How to create an object via forms using the builder pattern?

具有嵌套生成器的实体:

@Entity
@Table(name="food")
public class Food {

    @Id
    @Column(name="id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;

    @Column(name="name")
    private String name;

    @Column(name="type")
    private String type;

    @Column(name="description")
    private String description;

    @Column(name="date")
    private LocalDate expiration;

    @ManyToOne
    @JoinColumn(name="container_id", foreignKey = @ForeignKey(name = "FK_FOOD"))
    private Container container;

    private Food(FoodBuilder foodbuilder) {
        this.name = foodbuilder.name;
        this.type = foodbuilder.type;
        this.description = foodbuilder.description;
        this.expiration = foodbuilder.expiration;
    }

    //getters omitted for brevity

    public static class FoodBuilder {
        private String name;    
        private String type;
        private String description;
        private LocalDate expiration;


        public FoodBuilder(String name) {
            this.name = name;
        }

        public FoodBuilder setType(String type) {
            this.type = type;
            return this;
        }

        public FoodBuilder setDescription(String description) {
            this.description = description;
            return this;
        }

        public FoodBuilder setExpiration(LocalDate expiration) {
            this.expiration = expiration;
            return this;
        }

        public Food buildFood(){
            return new Food(this);
        }
    }
}

我知道如何使用 main 方法创建具有构建器模式的新对象,即

食物食物 = 新的 Food.FoodBuilder...setters...build()

但是当我通过前端表单向 api.

提交信息时,我无法找到如何使用此模式创建对象

我假设您的 api 调用正在发送一个序列化的 Food 对象,然后由控制器接收。如果您尝试通过专门使用给定的构建器将此数据反序列化为一个实例,jackson 应该能够通过提供 builder 参数的 JsonDeserialize 注释为您执行此操作。

工作代码(添加了@JsonDeserialize、@JsonPOJOBuilder、@JsonCreator 和@JsonProperty):

@Entity
@Table(name="food")
@JsonDeserialize(builder = Food.FoodBuilder.class)
public class Food {

    @Id
    @Column(name="id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;

    @Column(name="name")
    private String name;

    @Column(name="type")
    private String type;

    @Column(name="description")
    private String description;

    @Column(name="date")
    private LocalDate expiration;

    @ManyToOne
    @JoinColumn(name="container_id", foreignKey = @ForeignKey(name = "FK_FOOD"))
    private Container container;

    private Food(FoodBuilder foodbuilder) {
        this.name = foodbuilder.name;
        this.type = foodbuilder.type;
        this.description = foodbuilder.description;
        this.expiration = foodbuilder.expiration;
    }

    //getters omitted for brevity

    @JsonPOJOBuilder(buildMethodName = "build", withPrefix = "set")
    public static class FoodBuilder {
        private String name;    
        private String type;
        private String description;
        private LocalDate expiration;

        @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
        public FoodBuilder(@JsonProperty("name") String name) {
            this.name = name;
        }

        public FoodBuilder setType(String type) {
            this.type = type;
            return this;
        }

        public FoodBuilder setDescription(String description) {
            this.description = description;
            return this;
        }

        public FoodBuilder setExpiration(LocalDate expiration) {
            this.expiration = expiration;
            return this;
        }

        public Food buildFood(){
            return new Food(this);
        }
    }
}

如果您使用 JSP 设计前端,请通过导入 spring 表单标签库来使用 spring 表单标签。 您的控制器级别可以使用@ModelAttribute 获取整个对象。 Spring只有当所有的POJO都需要站立时才处理嵌套对象。