类中的字段值不会使用 Spring Boot MVC 控制器更新

Posted

技术标签:

【中文标题】类中的字段值不会使用 Spring Boot MVC 控制器更新【英文标题】:Field value in a Class does not get updated with Spring Boot MVC Controller 【发布时间】:2021-02-18 23:35:03 【问题描述】:

我有一个包裹实体,我正在通过@PostMapping 填充字段。值 Volume 应该从一个方法中获取,该方法从构造函数中的 agruments 中获取值。

控制器类:

    @Controller
public class Controller 

@Value("#$listOfBases")
private List<String> listOfBases;
@Value("#$listOfDestinations")
private List<String> listOfDestinations;


@Autowired
ParcelRepository parcelRepository;


@GetMapping("/register_parcel")
public String showParcelRegistrationForm(Model model) 

    Parcel parcel = new Parcel();
    model.addAttribute("parcel", parcel);
    model.addAttribute("listOfBases", listOfBases);
    model.addAttribute("listOfDestinations", listOfDestinations);
    return "parcel/register_form_parcel";



@PostMapping("register_parcel")
public String registerParcel(@ModelAttribute("parcel") Parcel parcel) 
    System.out.println(parcel);
    parcelRepository.save(parcel);

    return "user/user_registration_success_form";

 

包裹类别:

@Entity
 public class Parcel 

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
int id;
String length;
String width;
String height;
String weight;
String base;
String destination;
String creationDate;
String volume;

无参数构造函数:

public Parcel() 
    creationDate = getCreationDateAndTime();



public Parcel(int id, String length, String width, String height, String weight, String base, String destination) 
    this.id = id;
    this.length = length;
    this.width = width;
    this.height = height;
    this.weight = weight;
    this.base = base;
    this.destination = destination;
    creationDate = getCreationDateAndTime();
    volume = String.valueOf(calculateVolume(width, height, length));

Getter 和 Setter:

public int getId() 
    return id;


public void setId(int id) 
    this.id = id;


public String getLength() 
    return length;


public void setLength(String length) 
    this.length = length;


public String getWidth() 
    return width;


public void setWidth(String width) 
    this.width = width;


public String getHeight() 
    return height;


public void setHeight(String height) 
    this.height = height;


public String getWeight() 
    return weight;


public void setWeight(String weight) 
    this.weight = weight;


public String getBase() 
    return base;


public void setBase(String base) 
    this.base = base;


public String getDestination() 
    return destination;


public void setDestination(String destination) 
    this.destination = destination;


public String getCreationDate() 
    return creationDate;


public void setCreationDate(String creationDate) 
    this.creationDate = creationDate;



public String getVolume() 
    return volume;


public void setVolume(String volume) 
    this.volume = volume;


private String getCreationDateAndTime() 

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    LocalDateTime now = LocalDateTime.now();
    return dtf.format(now);

CalculateVolume 方法是问题的根源:

private int calculateVolume(String width, String height, String length) 

    int w = Integer.parseInt(width);
    int h = Integer.parseInt(height);
    int l = Integer.parseInt(length);

    return w * h * l;

但我的数据库中的值 volume 为空。甚至 System.out.println();在 calculateVolume 中不会在控制台上打印任何内容,但是当我在 main 中运行创建实例时,一切运行良好且花花公子。

关于我应该如何进行的任何想法,或者我的问题是否过于模糊?

谢谢

@Override
public String toString() 
    return "Parcel" +
            "id=" + id +
            ", length='" + length + '\'' +
            ", width='" + width + '\'' +
            ", height='" + height + '\'' +
            ", weight='" + weight + '\'' +
            ", base='" + base + '\'' +
            ", destination='" + destination + '\'' +
            ", creationDate='" + creationDate + '\'' +
            ", volume='" + volume + '\'' +
            '';

 

【问题讨论】:

当你打印这个 System.out.println(parcel);在你的后期控制器中,你有音量的价值吗? (顺便说一句,我会用 @PostMapping("/register_parcel") 替换您的注释) 【参考方案1】:

在控制器中更改 Post 方法 来自

public String registerParcel(@ModelAttribute("parcel") Parcel parcel)

public String registerParcel(@RequestBody Parcel parcel)

【讨论】:

以上是关于类中的字段值不会使用 Spring Boot MVC 控制器更新的主要内容,如果未能解决你的问题,请参考以下文章

如果删除过滤器类中的@component,则不会调用 Spring Boot 过滤器

spring boot加mybatis使用Map返回值设置

默认情况下,不要使用Spring Data Rest和Jpa公开Entity类中的字段

在对应的Configuration类中配置多个yml文件(Spring Boot)

当 Spring Boot 中的某些列为空时,@LastModifiedDate 不会更新

spring-boot -配置文件值注入