Использование форматера в веб-потоке - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь использовать Formatter в приложении webflux, но его выбрасывает

java .lang.IllegalStateException: перебор toIterable () / toStream () является блокировкой, которая не поддерживается в thread реактор-http-nio-2

Исключение указывает, что я не могу использовать блок, и метод ожидает объект типа PetType. Я хотел знать, есть ли другой способ сделать это

@Component
public class PetTypeFormatter implements Formatter<PetType> {

    private final PetTypeService petTypeServive;    

    public PetTypeFormatter(PetTypeService petTypeServive) {
        this.petTypeServive = petTypeServive;
    }

    @Override
    public String print(PetType petType, Locale locale) {
        return petType.getName();
    }


    @Override
    public PetType parse(String text, Locale locale) throws ParseException 
    {


        Iterable<PetType> findPetTypes =    petTypeServive.findAll().toIterable();

        for (PetType type : findPetTypes) 
        {
            if (type.getName().equals(text)) {
                return type;
            }
        }

        throw new ParseException("type not found: " + text, 0);
    }

}

Редактировать: сигнатура метода контроллера, который я использую, это

@PostMapping("/pets/new")
    public String processCreationForm(@ModelAttribute("owner") Owner owner, @Valid Pet pet,BindingResult result, ModelMap model) 

и свойство PetType класса Pet, которое я настраивал через пользовательский форматер при использовании web mvc

Edit2:

@Setter
@Getter
public class Pet
{   
    private String id;
    private PetType petType;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate birthDate; 
    private String name;
}

@Setter
@Getter
public class PetType
{
    private String name;

    @Override
    public String toString() {
        return name;
    }
}

1 Ответ

1 голос
/ 09 апреля 2020

Вы пытаетесь реализовать блокировку бизнес-логики c в формататоре.

Назначение интерфейса Formatter<T> состоит в том, чтобы писать пользовательский анализ строк, например, json strings, csv strings et c. и разобрать их в объект.

То, что вы делаете, - это вызов базы данных в формататоре, что является НЕ целью интерфейса форматтера.

Поскольку вы не показали нам:

  • цель форматера
  • , где используется форматер
  • что в передаваемой строке в форматтер
  • как выглядит ваш запрос
  • Что такое класс питомца
  • Что такое PetType

Я не могу помочь вам больше, чем это. Вы пытаетесь выполнить блокирующий вызов в приложении webflux в интерфейсе, который не позволяет реактивное кодирование (оно возвращает конкретное значение). Вам необходимо переосмыслить свое решение проблемы.

Пожалуйста, объясните, в чем ваша проблема и что вы хотите сделать, а не проблема с кодом, проблема, которую вы пытаетесь решить, и мы можем помочь вам больше.

...