Конвертер Spring Boot не работает в вызовах RESTJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Конвертер Spring Boot не работает в вызовах REST

Сообщение Anonymous »


Я пытаюсь использовать Converter для преобразования входных данных String, поступающих из запроса POST, в объект CountryDTO. Я создал класс CountryConverter и реализовал интерфейс Converter из Spring, а также добавил свой конвертер в FormatterRegistry в своем классе WebConfig.

Он работает с обычными методами класса @Controller, если я использую некоторые шаблоны и формы HTML, однако он не работает до выполнения любого метода класса @RestController.

Это сообщение я получаю в консоли, и я понимаю причину этого сообщения. Поскольку мой конвертер не работает, приложение пытается десериализовать строку в объект CountryDTO, но это терпит неудачу, потому что оно просто не может взять, например, строку «1» и десериализовать ее в целый объект CountryDTO.

Сообщение на консоли:

Решено [org.springframework.http.converter.HttpMessageNotReadableException: ошибка анализа JSON: невозможно создать экземпляр com.cydeo.dto.CountryDTO (хотя существует хотя бы один создатель): нет строкового аргумента конструктор/фабричный метод для десериализации из строкового значения ('1'); вложенным исключением является com.fasterxml.jackson.databind.exc.MismatchedInputException: невозможно создать экземпляр com.cydeo.dto.CountryDTO (хотя существует хотя бы один создатель): нет конструктора/фабричного метода строкового аргумента для десериализации из строкового значения ('1') в [Источник: (org.springframework.util.StreamUtils$NonClosingInputStream); строка: 5, столбец: 16] (через цепочку ссылок: com.cydeo.dto.UserDTO["country"])]

Я использую Spring Boot версии 2.7.7

Вот мой Тело запроса JSON:

{ "имя пользователя": "МайкС", "пароль": "Abc1", "страна": "1" } Вот мой код:

Мой класс CountryConverter:

import com.cydeo.dto.CountryDTO; импортировать com.cydeo.service.CountryService; импортировать org.springframework.core.convert.converter.Converter; импортировать org.springframework.stereotype.Component; @Компонент общедоступный класс CountryConverter реализует Converter { частный окончательный CountryService CountryService; public CountryConverter (CountryService CountryService) { this.countryService = CountryService; } @Override public CountryDTO Convert (Источник строки) { если (source.isEmpty()) { вернуть ноль; } пытаться { return CountryService.findById(Long.parseLong(source)); } catch (Исключение е) { е.printStackTrace(); вернуть ноль; } } } Мой класс WebConfig:

import com.cydeo.converter.CountryConverter; импортировать org.springframework.context.annotation.Configuration; импортировать org.springframework.format.FormatterRegistry; импортировать org.springframework.web.servlet.config.annotation.EnableWebMvc; импортировать org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Конфигурация @EnableWebMvc публичный класс WebConfig реализует WebMvcConfigurer { частный окончательный CountryConverter CountryConverter; public WebConfig (CountryConverter CountryConverter) { this.countryConverter = CountryConverter; } @Override общественная недействительность addFormatters (реестр FormatterRegistry) { реестр.addConverter(countryConverter); } } Мой класс UserDTO:

import com.fasterxml.jackson.annotation.JsonIgnore; импортировать ломбок.AllArgsConstructor; импортировать ломбок.Getter; импортировать ломбок.NoArgsConstructor; импортировать ломбок.Setter; импортировать javax.validation.constraints.*; @Getter @Сеттер @NoArgsConstructor @AllArgsConstructor общественный класс UserDTO { @JsonIgnore частный длинный идентификатор; @NotBlank(message = «Требуется имя пользователя») @Size(min = 3, max = 16, message = «Длина имени пользователя должна быть минимум 2, максимум 16») личное имя пользователя String; @NotBlank(сообщение = «Требуется пароль») @Pattern(regexp = "(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{4,}", message = "Пароль должен быть не менее 4 символов длиной и включать как минимум 1 заглавную букву, 1 строчную букву и 1 цифру") личный строковый пароль; @NotNull(message = «Укажите страну») частная страна CountryDTO; } Мой класс CountryDTO:

import com.fasterxml.jackson.annotation.JsonIgnore; импортировать ломбок.AllArgsConstructor; импортировать ломбок.Getter; импортировать ломбок.NoArgsConstructor; импортировать ломбок.Setter; @Getter @Сеттер @NoArgsConstructor @AllArgsConstructor общественный класс CountryDTO { @JsonIgnore частный длинный идентификатор; частная строка имя страны; } Мой класс UserController:
import com.cydeo.dto.ResponseWrapper; импортировать com.cydeo.dto.UserDTO; импортировать com.cydeo.service.UserService; импортировать org.springframework.http.HttpStatus; импортировать org.springframework.http.ResponseEntity; импортировать org.springframework.validation.BindingResult; импортировать org.springframework.validation.FieldError; импортировать org.springframework.web.bind.annotation.*; импортировать javax.validation.Valid; импортировать java.util.*; @RestController @RequestMapping("/api/user") общественный класс UserRestController { частный окончательный UserService userService; общественный UserRestController (UserService userService) { this.userService = userService; } @PostMapping("/create") public ResponseEntity createUser(@Valid @RequestBody UserDTO userDTO, BindingResultbindingResult) выдает исключение { если (bindingResult.hasErrors()) { List fieldErrors =bindingResult.getFieldErrors(); Map ответ = новый HashMap(); для (FieldError fieldError: fieldErrors) { если (response.containsKey(fieldError.getField())) { response.get(fieldError.getField()).put(fieldError.getCode(), fieldError.getDefaultMessage()); } еще { response.put(fieldError.getField(), new HashMap()); response.get(fieldError.getField()).put(fieldError.getCode(), fieldError.getDefaultMessage()); } } return ResponseEntity.badRequest().body(new ResponseWrapper(false, «Пожалуйста, проверьте информацию», HttpStatus.BAD_REQUEST, ответ)); } return ResponseEntity.status(HttpStatus.CREATED).body(new ResponseWrapper("Пользователь создан.", userService.create(userDTO), HttpStatus.CREATED)); } }
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»