typeMismatch.java.util.List при попытке установить список - PullRequest
8 голосов
/ 06 июля 2019

Я пытаюсь установить List<Long> для объекта Java.

Функция установки:

ResponseEntity<String> response = bcInsertService.addNewClip(new PrmBcClipInsert()
    .setTags(Arrays.asList(new Long[]{5L, 3L}))
);

И объект

public class PrmBcClipInsert implements Serializable {

    @ApiModelProperty(required = true)
    private List<Long> tags;

    public List<Long> getTags() {
        return tags;
    }

    public PrmBcClipInsert setTags(List<Long> tags) {
        this.tags = tags;
        return this;
    }
}

Это BcInsertService:

public class BcInsertService extends RestTemplate {
    private static final Logger log = LoggerFactory.getLogger(BcInsertService.class);

    public ResponseEntity<String> addNewClip(PrmBcClipInsert prmBcClipInsert) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        MultiValueMap<String, Object> map= new LinkedMultiValueMap<String, Object>();
        HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<MultiValueMap<String, Object>>(prmBcClipInsert.getParameters(), headers);

        ParameterizedTypeReference<StandardResponse> typeRef = new ParameterizedTypeReference<StandardResponse>() {};
        ResponseEntity<String> response = this.postForEntity( "http://localhost:8080/bc/add-clip", request , String.class );
        log.info(response.toString());
        return response;
    }

}

И он возвращает ошибку:

Ошибка поля в объекте 'prmBcClipInsert' в поле 'теги': отклонено значение [[5,3]]; коды [TypeMismatch.prmBcClipInsert.tags, typeMismatch.tags, typeMismatch.java.util.List, typeMismatch]; аргументы [Org.springframework.context.support.DefaultMessageSourceResolvable: коды [prmBcClipInsert.tags, теги]; аргументы []; сообщение по умолчанию [Теги]]; сообщение по умолчанию [Не удалось преобразовать значение свойства типа 'java.lang.String' для требуемого типа 'java.util.List' для свойства «метки»; Вложенным исключением является java.lang.NumberFormatException: для ввода строка: "[5,3]"]

Почему метод не принимает список, даже если он говорит, что он принимает список?

Ответы [ 2 ]

9 голосов
/ 09 июля 2019

Я смог воссоздать вашу ошибку, используя проверку формы.Вы вероятно пытаетесь передать данные формы, равные [5, 3] для переменной tags с типом List<Long>, но передача в скобках нарушает эту структуру, значение должно быть 5, 3 ...

Итак, что я сделал, это:

  1. Создайте фиктивный контроллер, используя ваш ввод;

    @Controller
    public class TestController {
    
        @PostMapping
        public ModelAndView test(@Validated @ModelAttribute final PrmBcClipInsert prmBcClipInsert, final BindingResult bindingResult) {
            final ModelAndView modelAndView = new ModelAndView();
            System.out.println(prmBcClipInsert.getTags());
            modelAndView.setViewName("test");
            return modelAndView;
        }
    }
    
  2. Передайте форму с tags=[5,3] и получите следующую ошибку в BindingResult;

    org.springframework.validation.BeanPropertyBindingResult: 1 error Ошибка поля в объекте 'prmBcClipInsert' в поле 'tags':отклоненное значение [[5, 3]];коды [typeMismatch.prmBcClipInsert.tags, typeMismatch.tags, typeMismatch.java.util.List, typeMismatch];аргументы [org.springframework.context.support.DefaultMessageSourceResolvable: codes [prmBcClipInsert.tags, tags];аргументы [];сообщение по умолчанию [теги]];сообщение по умолчанию [Не удалось преобразовать значение свойства типа 'java.lang.String' в требуемый тип 'java.util.List' для свойства 'tags';вложенное исключение - java.lang.NumberFormatException: для входной строки: "[5,3]"]

    Что является идентичной ошибкой, которую вы получили ... Так что я полагаю, вы либо получите это PrmBcClipInsert в качестве ввода формы, как в моем примере, или вы пытаетесь выполнить аналогичное связывание в какой-то другой части вашего кода ...

  3. Передайте форму с помощью tags=5,3, без ошибок ...


Может быть специальный преобразователь для поддержки передачи указанного ввода массива в скобках в логике привязки с чем-то вроде;

@Component
public class LongListConverter implements Converter<String, List<Long>> {

    @Override
    public List<Long> convert(String source) {
        return Arrays.stream(StringUtils.strip(source, "[]").split(","))
                .map(StringUtils::strip)
                .map(Long::new)
                .collect(Collectors.toList());
    }
}

При этом оба значения 5, 3 и [5, 3] могут быть заданы как значение переменной tags.

1 голос
/ 09 июля 2019

Все, что вам нужно, это конвертер здесь. Создайте преобразователь List <> String, как показано ниже (измените приведенный ниже пример в своем коде):

@Converter
public class StringListConverter implements AttributeConverter<List<String>, String> {
    private static final String SPLIT_CHAR = ";";

    // Go nuts on List to string here...

    @Override
    public String convertToDatabaseColumn(List<String> stringList) {
        return String.join(SPLIT_CHAR, stringList.toString());
    }

    @Override
    public List<String> convertToEntityAttribute(String string) {
        return Arrays.asList(string.split(SPLIT_CHAR));
    }
}

Попробуйте и поделитесь результатом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...