Spring 4.x / 3.x (веб-MVC) REST API и JSON2 Почтовые запросы, как правильно это сделать один раз для всех?

Прежде чем вдаваться в подробности, я знаю, что в Stackoverflow было много разговоров и связанных вопросов. Все они мне помогают по-разному, поэтому я думал, что все свои выводы я собрал в виде единого организованного FAQ, чтобы обобщить мои выводы.

Связанные понятия

Конечно, вы знаете об этом, но я просто пишу их как быстрый обзор. Не стесняйтесь редактировать, если я что-то упустил.

Запрос HTTP POST:

Пост-запрос используется, когда вы хотите отправить объект в веб-службу или приложение на стороне сервера.

Сериализация:

Является ли процесс получения объекта из вашего веб-браузера до вашего приложения на стороне сервера. Можно использовать вызов JQuery Ajax или запрос на запись Curl.

Протоколы сериализации:

Наиболее популярными тезисами являются JSON и XML. XML становится менее популярным, поскольку сериализованные объекты xml относительно большие по размеру из-за характера тегов XML. В этом FAQ основное внимание уделяется сериализации JSON2 .

Весна:

Spring framework и мощная аннотация позволяют эффективно публиковать веб-сервис. Весной существует множество разных библиотек. То, что здесь сосредоточено здесь, – это Spring Web MVC .

Curl vs JQuery:

Это инструменты, которые вы можете использовать для создания почтового запроса на своей стороне клиента. Даже если вы планируете использовать JQuery ajax-вызов, я предлагаю вам использовать Curl для целей отладки, так как он предоставляет вам подробный ответ после создания запроса на отправку.

@RequestBody vs @ RequestParam / @ PathVariable vs @ModelAttribute:

В случаях, когда у вас есть веб-служба, которая не зависит от вашей модели Java EE, необходимо использовать @RequestBody. Если вы используете модель и ваш объект JSON добавлен в модель, вы можете получить доступ к объекту через @ModelAttribute. Только в тех случаях, когда ваш запрос является либо запросом GET, либо комбинацией запросов GET и POST, вам нужно будет использовать @ RequestParam / @ PathVariable.

@RequestBody vs @ResposeBody:

Как видно из названия, это так просто, вам нужно только @ResponseBody, если вы отправляете ответ, после того, как клиентский метод обработал запрос.

RequestMappingHandlerAdapter vs AnnotationMethodHandlerAdapter:

RequestMappingHandlerAdapter – это новый обработчик сопоставлений Spring, который заменил AnnotationMethodHandlerAdapter с Spring 3.1. Если ваша существующая конфигурация все еще находится в AnnotationMethodHandlerAdapter, вы можете найти это сообщение полезным. Конфигурация, предоставленная в моем сообщении, даст вам представление о том, как настроить RequestMappingHandlerAdapter.

Настроить

Вам нужно будет настроить конвертер сообщений. Таким образом ваш сериализованный модуль сообщения JSON преобразуется в локальный объект Java на стороне вашего сервера.

Базовая конфигурация отсюда . Преобразователями были MarshallingHttpMessageConverter и CastorMarshaller в базовом образце конфигурации , я заменил их MappingJackson2HttpMessageConverter и MappingJacksonHttpMessageConverter.

Где разместить конфигурацию

Как мой проект настроен, у меня есть два файла конфигурации:

  • XML-контекст приложения. Один из них – это XML-файл приложения, в котором находятся ваш факс sessionFactory, компонент dataSource и т. Д.
  • MVC Dispatcher Servlet XML: здесь у вас есть компонент view view и импортируйте XML-контекст вашего приложения.

belet должен быть расположен в более поздней версии, это файл MVC Dispatcher XML.

            

У вас может быть несколько конвертеров сообщений. здесь я создал обычный JSON, а также конвертер сообщений JSON 2. Были использованы как Ref, так и нормальный формат bean-файла в XML-файле (лично я предпочитаю тег ref как его опрятный).

API REST

Вот пример controllerа, который предоставляет REST API.

Контроллер

Здесь вы обнаружите ваш REST API для HTTP-запроса.

 @Component @Controller @RequestMapping("/api/user") public class UserController { @RequestMapping(value = "/add", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public String insertUser(@RequestBody final User user) { System.out.println(user.toString()); userService.insertUser(user); String userAdded = "User-> {" + user.toString() + "} is added"; System.out.println(userAdded); return userAdded; } } 

Объект Java

 @JsonAutoDetect public class User { private int id; private String username; private String name; private String lastName; private String email; public int getId() { return externalId; } public void setId(final int id) { this.id = id; } public String getName() { return name; } public void setName(final String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(final String email) { this.email = email; } public String getUsername() { return username; } public void setUsername(final String username) { this.username = username; } public String getLastName() { return lastName; } public void setLastName(final String lastName) { this.lastName = lastName; } @Override public String toString() { return this.getName() + " | " + this.getLastName() + " | " + this.getEmail() + " | " + this.getUsername() + " | " + this.getId() + " | "; } } 

Почтовый вызов CURL

 curl -i -H "Content-Type: application/json" -X POST -d '{"id":100,"username":"JohnBlog","name":"John","lastName":"Blog","email":"[email protected]"}' http://localhost:8080/[YOURWEBAPP]/api/user/add 

Связанные должности и вопросы

Этот FAQ не был возможен, если бы это было не для всех людей, которые предоставили следующие должности и вопросы (этот список будет расширяться, если я столкнусь с полезными сообщениями / вопросами):

  1. Каков правильный тип контента JSON?
  2. Spring 3.0 делает ответ JSON с помощью конвертера сообщений Jackson
  3. Как отправлять данные POST JSON с помощью Curl из терминала / командной строки для тестирования Spring REST?
  4. Проводка API JSON для REST
  5. https://github.com/geowarin/spring-mvc-examples
  6. Как разместить JSON на PHP с завитой
  7. Весенний ОТДЫХ | MappingJacksonHttpMessageConverter создает недопустимый JSON
  8. https://github.com/eugenp/REST
  9. Spring Web MVC – проверка отдельных параметров запроса
  10. Как отправлять данные POST JSON с помощью Curl из терминала / командной строки для тестирования Spring REST?
  11. Как вы возвращаете объект JSON из Java-сервлета
  12. Какой тип MIME, если JSON возвращается API REST?

Почтовый вызов CURL

 curl -i -H "Content-Type: application/json" -X POST -d '{"id":100,"username":"JohnBlog","name":"John","lastName":"Blog","email":"[email protected]"}' http://localhost:8080/[YOURWEBAPP]/api/user/add 

Различные сценарии ошибок:

Здесь я исследую различные ошибки, которые могут возникнуть после того, как вы совершили звонок и что, возможно, пошло не так.

Сценарий первый:

 HTTP/1.1 404 Not Found Server: Apache-Coyote/1.1 Content-Type: text/html;charset=utf-8 Content-Length: 949 Date: Tue, 04 Jun 2013 02:59:35 GMT 

Это означает, что API REST не существует в указанном вами URL-адресе.

Основная причина:

  • У вас может быть опечатка в вашем запросе (поверьте, это может случиться)!
  • Возможно, ваша конфигурация пружины неправильная. Если это так, ему нужно еще больше углубиться в то, что на самом деле пошло не так, но я предусмотрел некоторые первоначальные действия, которые вам нужно сделать, прежде чем начинать более сложное исследование.

Действия:

После того, как вы убедитесь, что все сделано совершенно правильно, и ничего не случилось с вашей настройкой, или у вас нет URL-адреса: – Запустите maven clean. – Разверните свое веб-приложение или просто удалите его. – Повторное развертывание веб-приложения. Обязательно используйте только одну версию Spring в своем maven / gradle

Второй сценарий:

 HTTP/1.1 400 Bad Request Server: Apache-Coyote/1.1 Content-Type: text/html;charset=utf-8 Content-Length: 968 Date: Tue, 04 Jun 2013 03:08:05 GMT Connection: close 

Единственная причина этого заключается в том, что ваш запрос не отформатирован правильно. Если вы проверите подробный отклик, вы сможете увидеть «Запрос, отправленный клиентом, был синтаксически неправильным».

Основная причина:

Либо ваш формат JSON неверен, либо отсутствует обязательный параметр для объекта JAVA.

Действия:

Убедитесь, что вы предоставили объект JSON в правильном формате и с правильным количеством параметров. Неверные свойства не являются обязательными, но вам необходимо предоставить данные для всех свойств NotNullable. ОЧЕНЬ важно помнить, что Spring использует reflection Java, чтобы превратить ваш JSON-файл в объекты Java, что это значит? это означает, что имена переменных и методов являются CasE SensItiVe. Если ваш JSON-файл отправляет переменную «userName», то ваша соответствующая переменная в вашем Java-объекте ДОЛЖНА также быть названа «userName». Если у вас есть получатели и сеттеры, они также должны следовать тому же правилу. getUserName и setUserName, чтобы соответствовать нашему предыдущему примеру.

Сенарио три:

 HTTP/1.1 415 Unsupported Media Type Server: Apache-Coyote/1.1 Content-Type: text/html;charset=utf-8 Content-Length: 1051 Date: Wed, 24 Aug 2011 08:50:17 GMT 

Основная причина:

Тип мультимедиа Json не поддерживается вашим веб-сервисом. Это может быть связано с вашей аннотацией, не указывающей тип носителя, или вы не указываете тип носителя в команде Post Curl.

Действия:

Проверьте правильность настройки вашего конвертера сообщений и убедитесь, что аннотация веб-службы соответствует приведенному выше примеру. Если все было в порядке, убедитесь, что вы указываете тип контента в своем запросе на отправку Curl.

Тип мультимедиа json не поддерживается вашим веб-сервисом.

Senario N (!):

 HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Type: application/json;charset=UTF-8 Transfer-Encoding: chunked Date: Tue, 04 Jun 2013 03:06:16 GMT 

Поздравляем, что пользователь действительно отправляет на серверный REST API.

Для получения дополнительной информации о том, как настроить весеннюю проверку весеннего руководства mvc.

Связанные должности и вопросы

Этот FAQ не был возможен, если бы это было не для всех людей, которые предоставили следующие должности и вопросы (этот список будет расширяться, если я столкнусь с полезными сообщениями / вопросами):

  1. Каков правильный тип контента JSON?
  2. Spring 3.0 делает ответ JSON с помощью конвертера сообщений Jackson
  3. Как отправлять данные POST JSON с помощью Curl из терминала / командной строки для тестирования Spring REST?
  4. Проводка API JSON для REST
  5. https://github.com/geowarin/spring-mvc-examples
  6. Как разместить JSON на PHP с завитой
  7. Весенний ОТДЫХ | MappingJacksonHttpMessageConverter создает недопустимый JSON
  8. https://github.com/eugenp/REST
  9. Spring Web MVC – проверка отдельных параметров запроса
  10. Как отправлять данные POST JSON с помощью Curl из терминала / командной строки для тестирования Spring REST?
  11. Как вы возвращаете объект JSON из Java-сервлета
  12. Какой тип MIME, если JSON возвращается API REST?

Следует отметить, что class bean не может обрабатываться, если у него есть 2 или более сеттера для одного поля без @JsonIgnore на дополнительных. Spring / Jackson throw HttpMediaTypeNotSupportedException и статус http 415 Неподдерживаемый тип носителя.

Пример :

 @JsonGetter public String getStatus() { return this.status; } @JsonSetter public void setStatus(String status) { this.status = status; } @JsonIgnore public void setStatus(StatusEnum status) { if (status == null) { throw new NullPointerException(); } this.status = status.toString(); } 

Обновление. Мы также должны указать @JsonGetter и @JsonSetter в этом случае, чтобы не возникало проблем при использовании в качестве типа возврата.

Просто протестировал его с помощью Spring 3.2.2 и Jackson 2.2. Он отлично работает как параметр ( @RequestBody ) и / или как тип возврата ( @ResponseBody ).

Обновление 2:

Если @JsonGetter и @JsonSetter указаны, @JsonIgnore похоже, не требуется.

  • Весенний classификатор и заполнитель свойств
  • Mongodb Значение приращения внутри вложенного массива
  • Ошибка: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter. (I) V
  • Spring + Hibernate: другой объект с тем же значением идентификатора уже был связан с сеансом
  • как читать переменную системной среды в Spring applicationContext
  • Spring REST Service: как настроить удаление нулевых объектов в json-ответе
  • Spring MVC + JSON = 406 Не допускается
  • Spring, Jackson и Customization (например, CustomDeserializer)
  • Spring RedirectAttributes: addAttribute () vs addFlashAttribute ()
  • @RequestParam vs @PathVariable
  • Как условно включить или отключить запланированные задания весной?
  • Давайте будем гением компьютера.