Невозможно отправить запрос POST в SpringMVC

Я создал API, используя трикотаж и пружинный ботинок. Теперь, когда я нажимаю запрос POST с помощью Postman со следующим в теле запроса:

{
     "name":"something", "email":"something","location":"something","dateOfBirth":"something"
}

Оно работает. Функция сохранения этих данных:

@POST
@Path("/addEmployee")
    @Produces(MediaType.TEXT_PLAIN)
    public String addEmployee(@RequestBody Employee employee) {
        service.save(employee);
        return "Saved Successfully";
    }

Модель сотрудника:

@Entity
@Table(name = "employee")
@XmlRootElement(name = "employee")
@EntityListeners(AuditingEntityListener.class)
public class Employee {
    public Employee() {
    }
    @Id
    @Column(nullable = false, name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

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

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

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

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

    // getters and setters

Этот api вызывается следующей функцией на стороне клиента:

@RequestMapping(value = "/addEmployee", method = RequestMethod.GET)
    public ModelAndView addEmployee(ModelAndView model) {

        RestTemplate restTemplate = new RestTemplate();
        String url = "http://localhost:8080/api/addEmployee";

        EmployeeInfo employee = new EmployeeInfo();
        employee.setName("Ashish");
        employee.setEmail("anyhing");
        employee.setDateOfBirth("mybirthday");
        employee.setLocation("home");
        ResponseEntity<String> response = restTemplate.postForEntity(url, employee, String.class);

        model.setViewName("homePage");
        return model;
    }

Класс информации о сотруднике:

public class EmployeeInfo {

    private String name;

    private String email;

    private String location;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getEmail() {
        return email;
    }

Я получаю следующую ошибку:

  2018-09-16 15:57:13.706 ERROR 14892 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpClientErrorException: 404 null] with root cause

org.springframework.web.client.HttpClientErrorException: 404 null
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:86) ~[spring-web-4.3.19.RELEASE.jar:4.3.19.RELEASE]
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:708) ~[spring-web-4.3.19.RELEASE.jar:4.3.19.RELEASE]
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:661) ~[spring-web-4.3.19.RELEASE.jar:4.3.19.RELEASE]
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:621) ~[spring-web-4.3.19.RELEASE.jar:4.3.19.RELEASE]
    at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:415) ~[spring-web-4.3.19.RELEASE.jar:4.3.19.RELEASE]
    at com.example.controller.Home.addEmployee(Home.java:82) ~[classes/:na]

и такой длинный список.

Форма, которая вызывает это:

<form name = "myform" method = "post" action = "addEmployee" >
        <input type = "submit" value = "Save">
</form>

Обновлено: при изменении метода на стороне клиента = RequestMethod.GET на RequestMethod.POST ничего не происходит, но все равно появляется такая же ошибка Что я делаю не так?

Мы должны использовать RequestMethod.POST вместо Request Method.GET.

Vipul Gulhane 16.09.2018 12:45

используйте режим проверки браузера, при нажатии кнопки отправки проверьте консоль браузера, какой запрос был сделан.

Sayantan Mandal 16.09.2018 13:47

См. stackoverflow.com/a/36600434/2587435 о сопоставлении по умолчанию / ошибка и 404 для каждого твой комментарий

Paul Samsotha 17.09.2018 18:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
1 067
3

Ответы 3

После проверки вашего кода проблема находится в приложении на стороне клиента, где ваш сервер работает на порту 8090, а в api, который вы вызываете, имеет 8080 для addEmployee.

Измените этот String url = "http://localhost:8080/api/addEmployee"; на String url = "http://localhost:8090/api/addEmployee";, и все будет хорошо.

@RequestMapping(value = "/addEmployee", method = RequestMethod.GET)
    public String addEmployee(ModelAndView model) {



        RestTemplate restTemplate = new RestTemplate();
        String url = "http://localhost:8090/api/addEmployee";

        EmployeeInfo employee = new EmployeeInfo();
        employee.setName("Ashish");
        employee.setEmail("anyhing");
        employee.setDateOfBirth("mybirthday");
        employee.setLocation("home");

        System.out.println("WE HAVE REACHED HERE");
        String response = restTemplate.postForObject(url, employee, String.class);
        System.out.println(response);

        return "redirect:/home";
    }

Эй, я все еще получаю ту же ошибку, изменил метод запроса на POST. Страница ошибки Whitelabel В этом приложении нет явного сопоставления для / error, поэтому вы рассматриваете это как запасной вариант. Вс, 16 сентября, 16:27:58 IST 2018 Произошла непредвиденная ошибка (тип = внутренняя ошибка сервера, статус = 500). 404 null

A.Gautam 16.09.2018 12:59

извините, пока оставьте GET и можете ли вы изменить restTemplate.postForObject вместо restTemplate.postForEntity

kj007 16.09.2018 13:06

Да, изменено на restTemplate.postForEntity, но все равно ошибка

A.Gautam 16.09.2018 13:12

хм, это у вас контроллер называется (вы отлаживали) ?? просто проверьте, изменив на application / json из @Produces (MediaType.TEXT_PLAIN) или удалите его для поведения по умолчанию, можете ли вы поделиться своим демонстрационным кодом на github, я могу проверить ..

kj007 16.09.2018 13:16

Можете ли вы попробовать мой обновленный ответ, если он не работает, тогда поделитесь кодом на github, я проверю

kj007 16.09.2018 13:27

проверить это github.com/gautam2705/JerseyAPIgithub.com/gautam2705/clientToCallAPI

A.Gautam 16.09.2018 13:37

@ A.Gautam Проверьте мой обновленный ответ, вы сможете исправить это.

kj007 16.09.2018 16:22

Мы должны использовать RequestMethod.POST вместо RequestMethod.GET

@RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
    public ModelAndView addEmployee(ModelAndView model) {

        RestTemplate restTemplate = new RestTemplate();
        String url = "http://localhost:8080/api/addEmployee";

        EmployeeInfo employee = new EmployeeInfo();
        employee.setName("Ashish");
        employee.setEmail("anyhing");
        employee.setDateOfBirth("mybirthday");
        employee.setLocation("home");
        ResponseEntity<String> response = restTemplate.postForEntity(url, employee, String.class);

        model.setViewName("homePage");
        return model;
    }

Вот полный пример journaldev.com/3358/…

Vipul Gulhane 16.09.2018 12:52

Эй, я изменил тип methid на POST, но все равно получаю ту же ошибку.

A.Gautam 16.09.2018 13:02

404 означает, что запрошенный источник не существует по одной из следующих причин:

  1. Не существует метода контроллера для обработки запроса POST, поэтому попробуйте изменить which@RequestMapping(value = "/addEmployee", method = RequestMethod.GET) на @RequestMapping(value = "/addEmployee", method = RequestMethod.POST)

  2. попробуйте переместить этот метод и сделать его службой в спокойном контроллере, используя эту аннотацию @RestController

  3. Я вижу, что вы обращаетесь к этому / api / addEmployee, который, как мне кажется, настроен неправильно?

Эй, 1. изменил GET на POST, но это не решило проблему. 2. Хорошо, я попробую это, скоро сообщу вам. 3. Но этот маршрут работает должным образом, если я отправлю запрос POST с помощью почтальона.

A.Gautam 16.09.2018 14:21

Я предлагаю поместить всю вашу успокаивающую службу на спокойный Контроллер, чтобы упростить возврат ответа в формате JSON.

Ahmad Ababneh 16.09.2018 15:20

Другие вопросы по теме