Java 如何在我的spring boot rest服务中将字符串写入POJO转换器?

Java 如何在我的spring boot rest服务中将字符串写入POJO转换器?,java,spring,rest,spring-boot,converter,Java,Spring,Rest,Spring Boot,Converter,我有一个JavaFX客户机,它使用SpringBootV2.0.0中实现的Rest服务,在开发过程中,我创建了一个控制器,其中有一个POJO列表作为Post请求中的请求参数,因此我可以在一次调用中添加一组entities对象 这是我到现在为止所做的 我的控制器: @PostMapping private ServerResponse creatAllCompDatas( @RequestParam final List<ComponentDataForm> compo

我有一个JavaFX客户机,它使用SpringBootV2.0.0中实现的Rest服务,在开发过程中,我创建了一个控制器,其中有一个POJO列表作为Post请求中的请求参数,因此我可以在一次调用中添加一组entities对象

这是我到现在为止所做的

我的控制器:

@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;
}
这样我就恢复了我的后台

现在,我将为您提供我的前端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());
   }

}
@FXML
私有void doCommit(ActionEvent事件)引发UnirestException{
if(validate()){
最终可观察列表项=tableAtributes.getItems();
最终列表组件DataFormValues=new ArrayList();
items.stream().forEach(项->{
final ComponentDataForm requestItem=新ComponentDataForm();
setAttCode(item.getAttCode());
setAttTitle(item.getAttTitle());
setAttVal(item.getAttValue());
componentDataFormValues.add(requestItem);
});
HttpResponse asString=Unirest.post(应用程序\数据\服务\ 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].w.s.m.s.DefaultHandlerExceptionResolver:未能转换请求元素: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].w.s.m.s.DefaultHandlerExceptionResolver:由处理程序执行引起的已解决异常: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”:未找到匹配的编辑器或转换策略

经过一天的研究,我不知道我需要创建一个转换器,通过扩展
org.springframework.core.convert.converter.converter,将收到的请求参数解析到我的POJO创建字符串的接口,ComponentDataForm转换器

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();
    }

}

但是在这里我被卡住了,我不知道如何编写这个转换器。

所以我迷路了,直到我用了我的一些大脑并想出了一个主意

我的pojo是后端和前端之间共享的DTO,所以知道我不知道如何转换,我说了为什么不将这个过程委托给一些机制

杰克逊api来了

我重写了toString dto的方法来编写当前pojo的json字符串,在转换器中,我所拥有的只是使用
ObjectMapper
来读取这个json并将其解析到我的pojo(dto对象)

这是我的实现

    @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.
}

}