我正在使用Spring Boot Starter Web,Spring Data JPA和HATEOAS(不使用Spring Data REST)制作REST API,就像本教程https://spring.io/guides/tutorials/rest/中一样。 首先要提到的是,将Spring Data REST添加到依赖项时,我的问题不存在。
这是一个旅行计划器应用程序,有“用户”可以具有多个“ Trips”,但是添加“ Trip”也需要指定其“ User”。 一般来说,我试图用json主体发出POST请求,如下所示(我也从Trip Controller附加了Trip和User Entities以及POST方法)
//JSON THAT PRODUCES AN ERROR
{
"name" : "ExampleTrip",
"user" : "/users/1" <-this produces an error
}
// BASE ENTITY
@MappedSuperclass
public class BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
protected BaseEntity() {}
//ID GETTER AND SETTER
}
// USER ENTITY
@Entity
@Table(name = "users")
public class User extends BaseEntity {
public static final PasswordEncoder PASSWORD_ENCODER = new BCryptPasswordEncoder();
@Size(min = 3, max = 15, message = "Username must be between 3 and 15 characters long")
private String username;
private String firstName;
private String lastName;
@Size(min = 5, max= 20 message = "Password must be between 5 and 20 characters
long")
private String password;
@NotNull(message = "User must have role attached")
private String [] roles;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List <Trip> userTrips;
protected User() {
super();
};
public User(String username, String password, String firstName, String
lastName, String [] roles) {
this.username = username;
setPassword(password);
this.firstName = firstName;
this.lastName = lastName;
this.roles = roles;
}
public void addTrip(Trip trip) {
trip.setUser(this);
userTrips.add(trip);
}
// TRIP ENTITY
@Entity
@Table(name = "trips")
public class Trip extends BaseEntity {
@NotNull(message = "Trip must have its name")
@Size(max = 40, message = "Trip name must be up to 40 characters long")
private String name;
private int length = 0;
@OneToMany(mappedBy = "trip", cascade = CascadeType.ALL)
private List <TripDay> tripDays;
@ManyToOne
@NotNull
private User user;
protected Trip() {
super();
}
public Trip(String name, User user) {
this.name = name;
this.user = user;
}
//Getters and setters
}
//TRIP CONTROLLER POST METHOD
@RestController
public class TripController {
@PostMapping("/trips")
public ResponseEntity <?> createTrip(@Valid @RequestBody Resource<Trip> trip) throws URISyntaxException {
Resource <Trip> resource = tripResourceAssembler.toResource(tripRepository.save(trip.getContent()));
return ResponseEntity
.created(new URI(resource.getId().expand().getHref()))
.body(resource);
}
}
因此,发出发布请求会产生错误:
已解决的[org.springframework.http.converter.HttpMessageNotReadableException:JSON解析错误:无法构造***.tripplanner.user.User
的实例(尽管至少存在一个Creator):没有用于从字符串值反序列化的字符串参数构造函数/工厂方法('/用户/ 1');嵌套异常是com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造***.tripplanner.user.User
的实例(尽管存在至少一个Creator):没有用于从字符串值反序列化的字符串参数构造函数/工厂方法('/用户/ 1')
在[来源:(PushbackInputStream);行:4,列:1](通过参考链:***。tripplanner.trip.Trip [“ user”])]
与Spring Data REST相比,Spring Boot Starter Web,JPA和HATEOAS组合中缺少什么?我想自己构建整个端点结构并学习,这就是为什么我不想使用Spring Data REST。还是我的代码有问题? 当然,/ users / 1下有一个用户。
我已经尝试过像https://jira.spring.io/browse/DATAREST-687这样的解决方案,但它们是针对Spring Data Rest(如我所说的我不使用它),并且它们不起作用。
谢谢!