代码之家  ›  专栏  ›  技术社区  ›  Mohammed Housseyn Taleb

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

  •  0
  • Mohammed Housseyn Taleb  · 技术社区  · 6 年前

    我有一个JavaFX客户端,它使用Spring Boot v2中实现的Rest服务。0.0,在开发过程中,我确实创建了一个控制器,其中有一个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;
    }
    

    我的组件数据表单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]。w、 s.m.s.DefaultHandlerExceptionResolver:无法转换请求元素:org。springframework。网状物方法注释。MethodArgumentConversionNotSupportedException:未能转换“java”类型的值。lang.String[]”转换为所需类型“java”。util。列表';嵌套异常为java。lang.IllegalStateException:无法转换“java”类型的值。lang.String“到所需类型”com。easyData。位置easyPos。休息控制器。应用ComponentDataForm”:未找到匹配的编辑器或转换策略

    2018-05-17 14:47:24.970 WARN 3660---[nio-8443-exec-7]。w、 s.m.s.DefaultHandlerExceptionResolver:已解决由处理程序执行引起的异常:org。springframework。网状物方法注释。MethodArgumentConversionNotSupportedException:未能转换“java”类型的值。lang.String[]”转换为所需类型“java”。util。列表';嵌套异常为java。lang.IllegalStateException:无法转换“java”类型的值。lang.String“到所需类型”com。easyData。位置easyPos。休息控制器。应用ComponentDataForm”:未找到匹配的编辑器或转换策略

    经过一天的研究,我不明白我需要创建一个转换器,通过扩展 org.springframework.core.convert.converter.Converter; 用于创建字符串、组件数据格式转换器的接口

    但我被困在这里,我不知道如何写这个转换器。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Mohammed Housseyn Taleb    6 年前

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

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

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