Как записать конвертер String в POJO в моей службе весенней загрузки? - PullRequest
0 голосов
/ 17 мая 2018

У меня есть клиент JavaFX, который использует службу отдыха, реализованную в Spring Boot v2.0.0, при разработке я создал контроллер, в котором у него есть список POJO в качестве параметра запроса в запросе Post, поэтому я могу добавить набор объекты объекта в один вызов

Вот что я сделал до сих пор

Мой контроллер:

@PostMapping
private ServerResponse creatAllCompDatas(
        @RequestParam final List<ComponentDataForm> componentDataFormValues
) {

    if (isSessionValid()) {
        List<Long> datasIds = new ArrayList();
        componentDataFormValues.stream().forEach(formValue -> {
            MNG_COMPOSANT_DATA mng_composant_data = new MNG_COMPOSANT_DATA();

            mng_composant_data.setCmp_attr_code(formValue.getAttCode());
            mng_composant_data.setCmp_attr_label(formValue.getAttTitle());
            mng_composant_data.setCmp_attr_value(formValue.getAttVal());

            datasIds.add(mng_composant_data.getId());
        });

        initSuccessResponse(datasIds);
        return serverResponse;
    }
    initFailLoginResponse();
    return serverResponse;
}

Мой ComponentDataForm POJO (в данном случае DTO)

@Component
public class ComponentDataForm {
        @JsonProperty("attCode")
        private String attCode;
        @JsonProperty("attTitle")
        private String attTitle;
        @JsonProperty("attVal")
        private String attVal;

        public ComponentDataForm() {
        }

        public String getAttCode() {
            return attCode;
        }

        public void setAttCode(String attCode) {
            this.attCode = attCode;
        }

        public String getAttTitle() {
            return attTitle;
        }

        public void setAttTitle(String attTitle) {
            this.attTitle = attTitle;
        }

        public String getAttVal() {
            return attVal;
        }

        public void setAttVal(String attVal) {
            this.attVal = attVal;
        }

        @Override
        public int hashCode() {
            int hash = 7;
            hash = 29 * hash + Objects.hashCode(this.attCode);
            hash = 29 * hash + Objects.hashCode(this.attTitle);
            hash = 29 * hash + Objects.hashCode(this.attVal);
            return hash;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            }
            if (obj == null) {
                return false;
            }
            if (getClass() != obj.getClass()) {
                return false;
            }
            final ComponentDataForm other = (ComponentDataForm) obj;
            if (!Objects.equals(this.attCode, other.attCode)) {
                return false;
            }
            if (!Objects.equals(this.attTitle, other.attTitle)) {
                return false;
            }
            if (!Objects.equals(this.attVal, other.attVal)) {
                return false;
            }
            return true;
        }

        @Override
        public String toString() {
            return "ComponentDataForm{" + "attCode=" + attCode + ", attTitle=" + attTitle + ", attVal=" + attVal + '}';
        }

        public ComponentDataForm(String attCode, String attTitle, String attVal) {
            this.attCode = attCode;
            this.attTitle = attTitle;
            this.attVal = attVal;
        }


    }

Этим я возобновил свой бэкэнд

Теперь я предоставлю вам мой интерфейс Javafx:

@FXML
private void doCommit(ActionEvent event) throws UnirestException{

   if(validate()){
       final ObservableList<AppDataAttTDO> items = tableAtributes.getItems();
       final List<ComponentDataForm> componentDataFormValues = new ArrayList();
       items.stream().forEach(item -> {
           final ComponentDataForm requestItem = new ComponentDataForm();
           requestItem.setAttCode(item.getAttCode());
           requestItem.setAttTitle(item.getAttTitle());
           requestItem.setAttVal(item.getAttValue());

           componentDataFormValues.add(requestItem);
       });
       HttpResponse<String> asString = Unirest.post(APPLICATION_DATA_SERVICE_URL)
               .queryString("componentDataFormValues", componentDataFormValues)
               .asString();
       System.out.println(asString.getStatus());
       System.out.println(asString.getBody());
   }

}

Когда я отправляю запрос от моего клиента на мой сервер, сервер выдает следующее исключение

2018-05-17 14: 47: 24.970 WARN 3660 --- [nio-8443-exec-7] .wsmsDefaultHandlerExceptionResolver: Не удалось преобразовать элемент запроса: org.springframework.web.method.annotation.MethodArgumentConversionNotSupportedException: преобразовать значение типа «java.lang.String []» в требуемый тип «java.util.List»; вложенным исключением является java.lang.IllegalStateException: невозможно преобразовать значение типа «java.lang.String» в требуемый тип «com.easyData.pos.easyPos.rest.contoller.application.ComponentDataForm»: не найдено соответствующих редакторов или стратегии преобразования

2018-05-17 14: 47: 24.970 WARN 3660 --- [nio-8443-exec-7] .wsmsDefaultHandlerExceptionResolver: Устраненное исключение, вызванное выполнением обработчика: org.springframework.web.method.annotation.MethodArgumentConversionNotSupported Не удалось преобразовать значение типа «java.lang.String []» в требуемый тип «java.util.List»; вложенным исключением является java.lang.IllegalStateException: невозможно преобразовать значение типа «java.lang.String» в требуемый тип «com.easyData.pos.easyPos.rest.contoller.application.ComponentDataForm»: не найдено соответствующих редакторов или стратегии преобразования

После 1 дня исследования я понимаю, что мне нужно создать конвертер, который будет анализировать полученный параметр запроса для моего POJO, расширяя интерфейс org.springframework.core.convert.converter.Converter; для создания конвертера String, ComponentDataForm

Но вот я застрял, я не знаю, как написать этот конвертер.

1 Ответ

0 голосов
/ 18 мая 2018

Так что я был потерян, пока я не использовал часть своего мозга и не пришел с идеей

Мое pojo - это DTO, которое разделяется между бэкэндом и фронтэндом, поэтому я знаю, что не знаю, как конвертироватьЯ сказал, почему бы не делегировать этот процесс какому-либо механизму

Вот идет Джексон API

Я сделал переопределение метода toString dto, чтобы записать строку json текущего pojo и в конвертере всеЯ должен был использовать ObjectMapper, чтобы прочитать этот json, разобрать его в моем pojo (DTO Object)

Вот мое значение

    @Override
    public String toString() {
        try {
            return new ObjectMapper().writeValueAsString(this);
        } catch (JsonProcessingException ex) {
            Logger.getLogger(ApplicationFormAddController.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

для моего конвертера

public class AppDataFormConverter implements Converter<String, ComponentDataForm>{

@Override
public ComponentDataForm convert(String s) {
    System.out.println(s);
    ObjectMapper objectMapper = new ObjectMapper();
    try {
          return objectMapper.readValue(s, ComponentDataForm.class);
        } catch (IOException ex) {
        Logger.getLogger(AppDataFormConverter.class.getName()).log(Level.SEVERE, null, ex);
        }
    System.out.println("handled here");
    return new ComponentDataForm();
    }

}

и процесс регистрации конвертера

@Configuration
public class ConvertersConfig extends WebMvcConfigurerAdapter{

@Override
public void addFormatters(FormatterRegistry registry) {
    registry.addConverter(new AppDataFormConverter());
    super.addFormatters(registry); //To change body of generated methods, choose Tools | Templates.
}

}
...