Статус HTTP 415 - объект запроса находится в формате, не поддерживаемом

Я работаю над веб-сервисом java restful. Я получил его для запроса GET, но запрос POST не работает. Класс My Controller RestController. Я сделал это до сих пор:

@RequestMapping(value = "/api/signup", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public long signUp(@ModelAttribute ApiMemberModel apiMember) {
    memberService = new MemberDetailsService();
    Member m = memberService.createMember(apiMember.getUsername(), apiMember.getPassword(), apiMember.getEmail(), "");
    return m.getId();
}

Также попробовал RequestBody вместо ModelAttribute.

Я использую Расширение Postman для отправки запроса POST. Например:

{
    "username": "asd",
    "password": "sfsdg",
    "email": "[email protected]"
}

Но я получаю ошибку:

description The server refused this request because the request entity is in a format not supported by the requested resource for the requested method.

Что я делаю неправильно? Класс модели:

 public class ApiMemberModel {
    private String username;
    private String password;
    private String email;

    public ApiMemberModel(String username, String password, String email) {
        this.username = username;
        this.password = password;
        this.email = email;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

Ответ 1

Готов поспорить, что звонок из Postman не включает Content-Type: application/json.

HTTP 415 означает, что сервер не понимает формат носителя запроса. В контроллере вы указываете, что он принимает JSON, но вы не сказали, если запрос указал, что тело находится в этом формате. Просто потому, что вы помещаете данные в формат JSON, не означает, что сервер будет распознавать его, вы должны указать его в заголовке Content-Type.

Ответ 2

Spring предоставляет множество стандартных HttpMessageConverters по умолчанию, которые будут использоваться для преобразования, в зависимости от наличия определенной библиотеки в пути к классам проекта.

Например, если заголовок Content-Type в заголовке запроса был одним из приложений /json или application/xml, это означает, что тело POST содержит json или XML [популярные форматы], и если библиотека Jackson находится в вашем пути к классам, Spring передаст преобразование в MappingJackson2HttpMessageConverter [для json] или MappingJackson2XmlHttpMessageConverter [для xml].

Чтобы объявить зависимость от библиотеки Jackson (jackson-databind), укажите следующую зависимость в вашем pom.xml

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson.version}</version>
</dependency>

Ответ 3

У меня тоже была такая же проблема. Добавьте заголовок ContentType в приложение /xml (или любой другой сервис ur) для почтальона.

Ответ 4

Мне немного стыдно писать это, но я забыл поместить атрибут enctype="multipart/form-data" в тег формы:

<form action="rest/upload_function_path" method="post" enctype="multipart/form-data">
<!-- this thing right  --------------------------------^ there! -->
    <p>
    Your file is: <input type="file" name="fajl" />
    </p>
    <input type="submit" value="Upload It" />
</form>

Это довольно хромая ошибка, но также и то, что потребовалось некоторое время для понимания.