Postman Post запрос на загрузку Spring сохраняет все тело JSON, а не только значение поля. Как я могу это исправить? - PullRequest
0 голосов
/ 18 марта 2020

POSTMAN

Мой заголовок 'Content-Type' является 'application / json', и я отправляю его необработанным с JSON, который выглядит как это ...

{
    "category": "House Maintenance"
}

Заявка

Категория. java (модель)

@Data
@Entity
@Table(name = "Categories")
public class Category implements Serializable{
    private static final long serialVersionUID = -8577891700634111561L;

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;

    @Column(name = "category", nullable = false)
    private String category;

    public Category(String category){
        super();
        this.category = category;
    }

    public Category(){

    }
}

CategoryServiceImpl. java (метод сохранения)

@Override
  public void save(Category newCategory) {
      categoryRepository.save(newCategory);
  }

CategoryController. java (запрос)

@RequestMapping(value = "/categories", method = RequestMethod.POST)
    public void addCategory(@RequestBody String categoryName){
        Category newCategory = new Category(categoryName);
        categoryService.save(newCategory);
    }

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Ответ

Благодаря Ральфу Вагнеру я вернулся и изменил свой метод на следующий.

//Old
method(@RequestBody String category)

//New
method(@RequestBody Category category)

Я добавил «@JsonProperty» в мой » Категория Категория, чтобы избежать создания дополнительного класса.

//Old
@Column(name = "category", nullable = false)
private String category;

//New
@Column(name = "category", nullable = false)
@JsonProperty(value = "category")
private String category;

Моя база данных теперь правильно хранится.

0 голосов
/ 18 марта 2020

Вы конвертируете запрос в строку в методе контроллера, поэтому вы получаете все тело запроса и задаете для поля категории всю строку json.

То, что вы хотите сделать, это то, что Spring Boot уже дает вам преобразованное dto:

@RequestMapping(value = "/categories", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public void addCategory(@RequestBody Category category){
  categoryService.save(category);
}

Если вы не хотите связывать вашу сущность с запросом, вам нужно ввести дополнительную класс, например CreateCategoryDto:

@Data
public class CreateCategoryDTO{

  @JsonProperty(value = "category") 
  private String category;
}

(я предполагаю, что вы используете Ломбока и Джексона. Аннотация @JsonProperty(value = "category") добавлена ​​только для иллюстрации того, как отделить Java имена полей от Json имена.)

Контроллер становится

@RequestMapping(value = "/categories", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public void addCategory(@RequestBody CreateCategoryDto categoryDto){

  Category newCategory = new Category(categoryDto.getCategory());
  categoryService.save(newCategory);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...