Как сделать правильный POST-запрос к моему проекту Spring REST? - PullRequest
1 голос
/ 06 января 2020

Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь выполнить ЗАПРОС ПОСТА, например:

curl -H "Content" -X POST -d '{"content":"abc"}' http://localhost:8080/posts

Я получаю новое сообщение, но без данных:

{
id: 4,
content: null,
comment: [ ]
}

У меня есть некоторые предварительно загруженные данные из файла SQL (я включил H2 в моем проекте):

INSERT INTO post(id, content) VALUES (1, 'This is a post')
INSERT INTO post(id, content) VALUES (2, 'This is a post')
INSERT INTO post(id, content) VALUES (3, 'This is a post')

Моя сущность:

@Entity
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String content;

   @OneToMany(cascade = CascadeType.ALL, mappedBy = "post")
   private Set<Comment> comment;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public Set<Comment> getComment() {
        return comment;
    }

    public void setComment(Set<Comment> comment) {
        this.comment = comment;
    }
}

От мой контроллер:

 @PostMapping("/posts")
    public @ResponseBody String add(@ModelAttribute Post p){

        postRepository.save(p);

        return "{msg : Resource added }";
    }

В моем исследовании этой проблемы я узнал, что вы можете использовать RestController, однако я не использую это в своем примере, так как мой код взят из моего школьного проекта, и учитель хочет, чтобы мы использовать @ResponseBody et c.

Мой метод @PostMapping чего-то не хватает? или это мое логово неверно?

1 Ответ

0 голосов
/ 06 января 2020

Основная причина, по которой @ModelAttibute не работает в вашем случае, потому что он ограничен параметрами публикации формы и в вашем случае нет формы.

Где с @RequestBody вы получаете тело запроса напрямую , По этой причине ваш @ModelAttribute не работает

Чтобы использовать @ModelAttribute, вы должны создать форму с modelattribute

Примером ниже

  <form:form method="POST" action="/posts"
      modelAttribute="posts">
        <form:label path="name">Name</form:label>
        <form:input path="name" />

        <form:label path="id">Id</form:label>
        <form:input path="id" />

        <input type="submit" value="Submit" />
    </form:form>

И затем в вашем контроллере что-то вроде

@PostMapping("/posts")
    public @ResponseBody String add(@ModelAttribute("posts") Post p){

        postRepository.save(p);

        return "{msg : Resource added }";
    }

Но поскольку вы используете curl для ваших запросов, лучше всего подходит @RequestBody для получения параметров записи.

Дальнейшее чтение здесь

...