Home > Blockchain >  Convert Java object list to entity list
Convert Java object list to entity list

Time:05-11

I have multiple objects in my array using . If I then send this to my Spring Boot backend with axios and output the FormData beforehand, I get the following image. That fits. In the backend, however, I need this list of objects as an entity. In this case, of type List. Do I do that?

Frontend code:

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

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

React:

enter image description here

Backend:

enter image description here

 @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: class java.lang.String cannot be cast to class com.home.calendar.User.User

UPDATE

For completeness, here is the user entity and the complete method for a new entry.

    @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) { }

The User Entity:

@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]

CodePudding user response:

Spring can't parse an unknown object.
To get it work, I suggest a new class for the "request".

@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
}

The controller can now use very type-safe objects.

@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);
   }
 ...
}

Typescript

Let axios handle the typing and serializing. See this tutorial: https://masteringjs.io/tutorials/axios/post-json

To post all the needed data, you can create a new object.

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

You can also create a interface in typescript, but this is going to much for a stackoverflow-answer. Try to learn more about spring and typescript.

CodePudding user response:

Based on question & comments ,

your front end call data.append("zugeordnet", JSON.stringify(personNamen)); is converting your object to List<String> instead of List<User>.

So you can transform this List<String> to List<User> in your postMapping:

@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));
   }
  ...
  }
  • Related