【问题标题】:How to create an object via forms using the builder pattern?如何使用构建器模式通过表单创建对象?
【发布时间】:2020-03-28 20:45:02
【问题描述】:

具有嵌套构建器的实体:

@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 food = new Food.FoodBuilder...setters...build()

但是当我通过前端的表单向我的 api 提交信息时,我无法找到如何使用此模式创建对象。

【问题讨论】:

  • 如果您使用的是 Servlet,那么您将哪个框架用于后端,那么您可以像在 main 方法中一样构建模式。

标签: java frontend builder


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      工作代码(添加了@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);
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多