При отправке объекта из шаблона thymeleaf в Rest Controller возвращается «Unsupported Media Type» - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь ПОСТАВИТЬ некоторые поля объекта в RestController, используя тимелеф.

Но результат сообщения возвращает то, что выглядит как ошибка синтаксического анализа:

Произошла непредвиденная ошибка (тип = Неподдерживаемый тип носителя, статус = 415). Тип содержимого 'application / x-www-form-urlencoded; charset = UTF-8' не поддерживается

Страница индекса отправляет два атрибута контроллеру, который затем вызывает бизнес-службу, которая создает новый объект.

 <!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">

<head>

<meta charset="utf-8">
<meta name="viewport"
    content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">

<title>Simple Sidebar - Start Bootstrap Template</title>

<!-- Bootstrap core CSS -->
<link th:href="@{/index/vendor/bootstrap/css/bootstrap.min.css}"
    rel="stylesheet">

<!-- Custom styles for this template -->
<link th:href="@{/index/css/simple-sidebar.css}" rel="stylesheet">

</head>

<body>

        <!-- Page Content -->
        <div id="page-content-wrapper">
            <div class="container-fluid">
                <form action="#" th:action="@{/accounts}" th:object="${account}" method="post" enctype="application/json">
                    <div class="form-row">
                        <div class="form-group col-md-4 ">
                            <label for="inputState">Departement</label>
                            <input type="text" th:field="*{owner}"  class="form-control" placeholder="Type in the department ..." />
                            </div>
                    </div>  
                    <div class="form-row">
                        <div class="form-group col-md-4 ">
                            <label for="inputState">Budget</label>
                            <input type="number" step="0.01" th:field="*{budget}"  class="form-control" placeholder="Type in Budget ..." />
                            </div>
                    </div>
                    <button class="btn btn-primary" type="submit">Enregistrer</button>
                </form>
            </div>
        </div>
        <!-- /#page-content-wrapper -->

</body>
</html>

Это контроллер покоя:

@RestController
public class AccountController {

@Autowired
private AccountService accountService;

@RequestMapping(value="/accounts", method=RequestMethod.POST)
public void addAccount(@RequestBody Account account ) {
    accountService.addAccount(account);
}

}

Аккаунт - это простое POJO:

public class Account {


private String id;
private String owner;
private double budget;
private double budgetInvest;
private double budgetFonction;

public Account() {

}

public Account(String id,String owner, double budget, double budgetInvest, double budgetFonction 
        ) {
    super();
    this.id = id;
    this.owner=owner;
    this.budget = budget;
    this.budgetInvest = budgetInvest;
    this.budgetFonction = budgetFonction;
}

public Account (String owner, double budget) {
    this.owner = owner;
    this.budget=budget;
}

public String getId() {
    return id;
}

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

public double getBudget() {
    return budget;
}

public void setBudget(double budget) {
    this.budget = budget;
}

public double getBudgetInvest() {
    return budgetInvest;
}

public void setBudgetInvest(double budgetInvest) {
    this.budgetInvest = budgetInvest;
}

public double getBudgetFonction() {
    return budgetFonction;
}

public void setBudgetFonction(double budgetFonction) {
    this.budgetFonction = budgetFonction;
}

public String getOwner() {
    return owner;
}

public void setOwner(String owner) {
    this.owner = owner;
}




}

А метод add просто добавляет объект в список объектов.

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 07 января 2019

Я думаю, проблема в вашем контроллере. Сначала это не будет @RestController. Это будет @Controller. Во-вторых, это не будет @RequestBody. Это будет @ModelAttribute. Так напишите ваш контроллер как

@Controller
public class AccountController {

@Autowired
private AccountService accountService;

@RequestMapping(value="/accounts", method=RequestMethod.POST)
public void addAccount(@ModelAttribute("account") Account account ) {
   System.out.ptintln("Checking");
    accountService.addAccount(account);
}

The most relevant to the discussion of REST, the @RestController annota- tion tells Spring that all handler methods in the controller should have their return value written directly to the body of the response, rather than being carried in the model to a view for rendering. Эта строка из книги spring in action. Так что здесь вы должны использовать @Controller аннотацию.

...