无法使用属性为其对象的JSON解析,该对象的属性为其父资源位置,例如Spring Boot中的“​​ / resources / {parentID}”

时间:2019-07-10 15:08:12

标签: json spring rest spring-boot

我正在使用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(如我所说的我不使用它),并且它们不起作用。

谢谢!

0 个答案:

没有答案