繁体   English   中英

将 Java 对象列表转换为实体列表

[英]Convert Java object list to entity list

我的数组中有多个对象,使用 . 如果我随后使用 axios 将其发送到我的 Spring Boot 后端并预先输出 FormData,我会得到以下图像。 那适合。 然而,在后端,我需要这个对象列表作为一个实体。 在这种情况下,类型为 List。 我这样做吗?

前端代码:

 let data = new FormData();
 ...
 data.append("zugeordnet", JSON.stringify(personNamen));

 await axios.post("/neuerEintrag", data,...)

反应:

在此处输入图像描述

后端:

在此处输入图像描述

 @PostMapping("/neuerEintrag")
 public String neuerEintrag(HttpServletRequest req,@RequestParam("zugeordnet") List<?> zugeordnet,..) {

    List<User> userListe = (List<User>) zugeordnet;

    for(User inListe : userListe) //ERROR here
    {
        System.out.println("USER :" + inListe);
    }

  ...
  }

java.lang.ClassCastException:类 java.lang.String 不能转换为类 com.home.calendar.User.User

更新

为了完整起见,这里是用户实体和新条目的完整方法。

    @PostMapping("/neuerEintrag")
    public String neuerEintrag(HttpServletRequest req, @RequestParam("beschreibung") String beschreibung,
    @RequestParam("datum") Date datum, @RequestBody List<User> zugeordnet,
    @RequestBody List<Freunde> kontaktAuswahl, @RequestParam("neuAlt") String neuAlt,
    @RequestParam("kalenderId") int kalenderId) { }

用户实体:

@Entity
public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

private String name;

@JsonIgnoreProperties("user")
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "user")
private List<Kalender> kalenderEinträge;


public User() {
    super();
    // TODO Auto-generated constructor stub
}


public User(String name, List<Kalender> kalenderEinträge) {
    super();
    this.name = name;
    this.kalenderEinträge = kalenderEinträge;
}

public List<Kalender> getKalenderEinträge() {
    return kalenderEinträge;
}

 [getter/setter]

Spring 无法解析未知对象。
为了让它发挥作用,我建议为“请求”开设一个新课程。

@Data // lombok - this generates getter/setters/equals/hashcode for you
public class NeuerEintragRequest {
    
    private List<User> zugeordnet;
    private String beschreibung;
    private int kalendarId;
    
    // and your others fields
}

控制器现在可以使用非常类型安全的对象。

@PostMapping("/neuerEintrag")
public String neuerEintrag(@RequestBody NeuerEintragRequest request) {
   for(User user : request.getUserlist()) {
       // a logging framework is a lot better. Try to use log4j or slf4j.
       log.info("USER: {}", user);
   }
 ...
}

打字稿

让 axios 处理打字和序列化。 请参阅本教程: https ://masteringjs.io/tutorials/axios/post-json

要发布所有需要的数据,您可以创建一个新对象。

 // no formdata - just send the object
 const data = { zugeordnet: personNamen, kalendarId: 123, beschreibung: 'abc' };
 await axios.post("/neuerEintrag", data);

您还可以在 typescript 中创建一个界面,但这对于 stackoverflow-answer 来说意义重大。 尝试了解更多关于 spring 和 typescript 的信息。

根据问题和评论,

你的前端调用data.append("zugeordnet", JSON.stringify(personNamen)); 正在将您的对象转换为List<String>而不是List<User>

因此,您可以在postMapping中将此List<String>转换为List<User>

@PostMapping("/neuerEintrag")
 public String neuerEintrag(HttpServletRequest req,@RequestParam("zugeordnet") List<?> zugeordnet,..) {
    ObjectMapper mapper=new ObjectMapper();
    for(String str:zugeordnet){
     System.out.println(mapper.readValue(str, User.class));
   }
  ...
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM