HTTP Status 415 - неподдерживаемый тип носителя при выполнении запроса POST в Spring MVC - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь отправить запрос на публикацию в простом веб-приложении Spring MVC и использую RequestBody в своем контроллере для преобразования JSON в объект Java, но по какой-то причине я продолжаю получать HTTP Status 415 – Unsupported Media Type.Я потратил много времени, пытаясь найти решение этой проблемы, но, похоже, ничего не работает.

Метод get в моем контроллере работает нормально.Это мой оригинальный код

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping(value = "/users", method = RequestMethod.POST)
public class MyControllerAgain {

    @RequestMapping(method = RequestMethod.POST, consumes = "application/json")
    public void handleJson(@RequestBody Contact c) {
        System.out.println(c);
    }

    @RequestMapping(method = RequestMethod.GET, consumes = "application/json")
    public void handleGet() {
        System.out.println("a");
    }
}

Это мой Contact

public class Contact {

    int id;

    public String name;

    public int number;

    public Contact(){}

    // Getters and setters
}

Я отправляю запрос с почтальоном, и вот как это выглядит

POST /users HTTP/1.1
Host: localhost:8080
Content-Type: application/json
Accept: application/json
Cache-Control: no-cache
Postman-Token: 511c9e03-4178-380d-58f8-db24a3245b9e

{
    "id":1,
    "name":"something",
    "number":1
}

Я также пытался включить зависимости Джексона в мой pom.xml.Я попытался изменить значение потребления в аннотации @RequestMapping, и я попробовал все комбинации заголовков принять и тип содержимого в моем запросе.

Кроме того, если я использую @ModelAttribute вместо @RequestBody, то все работает нормально, за исключением того, что все поля в классе Contact имеют значение null.

Вот ссылка на github - https://github.com/Sanil2108/test_springmvc

Ответы [ 4 ]

0 голосов
/ 09 октября 2018

Пробовал все, но это не сработало.Возможно, я где-то допустил глупую ошибку или что-то серьезно не так с моей конфигурацией.Во всяком случае, я пытался заставить его работать с загрузкой Spring, и он работал нормально.Для всех, кто заинтересован, вот ссылка на github - https://github.com/Sanil2108/spring_hibernate/tree/master/spring_boot1

Также, спасибо всем, кто пытался помочь!

0 голосов
/ 07 октября 2018

Добавьте отображение в метод handleGet, например:

@RequestMapping(value = "/get", method = RequestMethod.GET, consumes = "application/json")
public void handleGet() {
    System.out.println("a");
}

- ОБНОВЛЕНИЕ -

Удалите часть consumes = "application/json" из вашего вызова GET.Он видит, что оба запроса, которые слушают "/ users", могут использовать данные json, но один - GET, а другой - POST.

- 2nd UPDATE-- Это будетопределенно работать.Протестировано.

@RestController
@RequestMapping(value = "/users", method = RequestMethod.POST)
public class ContactController
{
    @RequestMapping(method = RequestMethod.POST, consumes = "application/json")
        public void handleJson(@RequestBody Contact c) 
        {
           System.out.println(c);
        }
}
0 голосов
/ 07 октября 2018

RequestMapping аннотация не только имеет consumes, но и produces.

Но чтобы избежать всех этих настроек для HTTP REST, вы можете использовать RestController аннотацию и GetMapping, PostMapping etc ..

Вы можете найти пример в моем github

0 голосов
/ 07 октября 2018

Мне кажется, что аннотации jpa портят десериализацию json.

Ошибка, возвращаемая сервером Spring, может вводить в заблуждение.Попробуйте использовать обычный объект с сеттерами и геттерами и посмотрите, изменит ли это что-нибудь.Вы должны искать некоторые исключения в журналах.

...