如何在邮递员中传递类对象?

时间:2019-08-26 18:28:26

标签: java spring hibernate jpa postman

我是spring和hibernate的新手,并且创建了spring mvc应用程序。我遇到的问题是我的预订实体。当我从邮递员中的ReservationController调用add函数时,系统收到400错误的请求,由于某些东西被认为是客户端错误(例如,格式错误的请求语法,无效的请求消息框架),服务器无法或不会处理该请求,或欺骗性请求路由)。我相信它来自作为用户类型的hostId和guestId,因为我的usercontroller.java的add方法可以正常工作,但是,我不确定100%就是这个问题。如果有人知道如何解决此问题,请提供帮助。

我试图像这样通过邮递员传递信息

 {
        "confirmation": 4488,
        "guestId": "userId": 44,
        "hostId": "userId": 45,
        "checkInDate": "8/27/2019",
        "checkOutDate": "8/31/2019",
        "city": "Las Vegas",
        "state": "NV"
    }

,也喜欢:

 {
        "confirmation": 4488,
        "guestId": [
                    "userId": 44,
                    "username": "username",
                    "password": "password",
                    "firstName": "name",
                    "lastName": "lastname",
                    "ssid": "WiFi",
                    "ssidPassword": "password!"],
        "hostId": [
                    "userId": 45,
                    "username": "user2",
                    "password": "password",
                    "firstName": "name2",
                    "lastName": "lastname2",
                    "ssid": "Red",
                    "ssidPassword": "red$1"],
        "checkInDate": "8/27/2019",
        "checkOutDate": "8/31/2019",
        "city": "Las Vegas",
        "state": "NV"
    }

但这些都不起作用。

User.java

@Entity
@Table(name="User", schema="DB", uniqueConstraints = {@UniqueConstraint(columnNames= "Username")})
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="User_Id")
    private Integer userId;

    @Column(name="Username", unique=true)
    private String username;

    @Column(name="Password")
    private String password;

    @Column(name="First_Name")
    private String firstName;

    @Column(name="Last_Name")
    private String lastName;

    @Column(name="SSID")
    private String ssid;

    @Column(name="SSID_Password")
    private String ssidPassword;

    @OneToMany(mappedBy = "guestId", fetch = FetchType.EAGER)
    private Set<Reservation> guestReservations = new HashSet<>();

    @OneToMany(mappedBy= "hostId", fetch = FetchType.EAGER)
    private Set<Reservation> hostReservations = new HashSet<>();

    ...

Reservation.java


@Entity
@Table(name="Reservations", schema="DB")
public class Reservation implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="Confirmation_Num")
    private Integer confirmation;

    @JoinColumn(name="Guest_Id")
    @ManyToOne
    private User guestId;

    @JoinColumn(name="Host_Id")
    @ManyToOne
    private User hostId;

    @Column(name="Check_In_Date", unique=true)
    private String checkInDate;

    @Column(name="Check_Out_Date", unique=true)
    private String checkOutDate;

    @Column(name="City")
    private String city;

    @Column(name="State")
    private String state;

...

ReservationRepository.java


@Transactional
@EnableTransactionManagement
@Repository
public class ReservationRepository {

    @Autowired
    SessionFactory sf;

    //Creates a new reservation
    public String add(Reservation res) {
        Session s = sf.getCurrentSession();
        s.persist(res);
        return "Reservation Requested";
    }

    public List<Reservation> selectAll(){
        List<Reservation> res = new ArrayList<Reservation>();
        Session s = sf.getCurrentSession();
        Criteria cr = s.createCriteria(Reservation.class);
        res = cr.list();
        return res;
    }

    public void update(Reservation change) {
        Session s = sf.getCurrentSession();
        s.update(change);
    }

UserRepository.java


@Transactional
@EnableTransactionManagement
@Repository
public class UserRepository {

    @Autowired
    SessionFactory sf;

    //Allows you to create a new user
    public String add(User user) {
        Session s= sf.getCurrentSession();
        s.persist(user);
        return "user created";
    }

    public List<User> selectAll(){
        List<User> users = new ArrayList<User>();
        Session s = sf.getCurrentSession();
        Criteria cr = s.createCriteria(User.class);
        users = cr.list();
        return users;
    }

    public void update(User change) {
        Session s = sf.getCurrentSession();
        s.update(change);
    }

    public void delete(User usr) {
        Session s = sf.getCurrentSession();
        s.delete(usr);
    }

    public List<User> select(String username){
        List<User> user = new ArrayList<User>();
        Session s = sf.getCurrentSession();
        Criteria cr = s.createCriteria(User.class);
        cr.add(Restrictions.eq("username", username));
        user = cr.list();
        return user;
    }


ReservationController.java


@Controller
@RequestMapping("/Reservation")
@CrossOrigin(origins="*", allowedHeaders="*", value="*")
public class ReservationController {

    @Autowired
    ReservationService resServ;

    @PostMapping(value="/add")
    @ResponseBody
    public void add(@RequestBody Reservation res) {
        resServ.add(res);
    }

    @GetMapping("/all")
    public ResponseEntity<List<Reservation>> selectAll(){
        return new ResponseEntity<>(resServ.selectAll(), HttpStatus.OK);
    }

    @PutMapping("/update")
    public void update(@RequestBody Reservation change) {
        resServ.update(change);
    }

    @DeleteMapping("/delete")
    public void delete(@RequestBody Reservation res) {
        resServ.delete(res);
    }

    @GetMapping(value="/selectByGuest/{guestId}")
    public ResponseEntity<List<Reservation>> selectAllForGuest(@PathVariable String guestId){
        return new ResponseEntity<>(resServ.selectAllForGuest(guestId), HttpStatus.OK);

    }

    @GetMapping(value="/selectByHost/{hostId}")
    public List<Reservation> selectAllForHost(@PathVariable String hostId){
        return resServ.selectAllForHost(hostId);
    }
}

UserController.java

@Controller
@RequestMapping("/User")
@CrossOrigin(origins="*", allowedHeaders="*", value="*")
public class UserController {

    @Autowired
    UserService usrServ;

    @PostMapping(value="/add")
    @ResponseBody
    public void add(@RequestBody User usr) {
        usrServ.add(usr);
    }

    @GetMapping(value="/all")
    public ResponseEntity<List<User>> selectAll(){
        return new ResponseEntity<>(usrServ.selectAll(), HttpStatus.OK);
    }


    @PutMapping(value="/update")
    public void update(@RequestBody User change) {
        usrServ.update(change);
    }


    @DeleteMapping(value="/delete")
    public void delete(@RequestBody User usr) {
        usrServ.delete(usr);
    }

    @GetMapping(value="/select/{username}")
    public ResponseEntity<List<User>> select(@PathVariable String username){
        return new ResponseEntity<>(usrServ.select(username), HttpStatus.OK);
    }

    @GetMapping(value="/selectSSID/{username}")
    public ResponseEntity<String> selectSSID (@PathVariable String username){
        return new ResponseEntity<>(usrServ.selectSSID(username), HttpStatus.OK); 
    }

    @GetMapping(value="/selectSSIDP/{username}")
    public ResponseEntity<String> selectSSIDPassword (@PathVariable String username){
        return new ResponseEntity<>(usrServ.selectSSIDPassword(username), HttpStatus.OK); 
    }
}

1 个答案:

答案 0 :(得分:0)

对于您的案例,控制器期望User对象的有效JSON表示形式。您有问题的那一个无效的JSON字符串。

Json format docs

要获得有效的代表,您可以执行以下操作:

User user = new User();
user.setConfirmation(123);
ObjectMapper objectMapper = new ObjectMapper();
System.out.printLn(objectMapper.writeValueAsString(user));