【问题标题】:SOAP Request Mapping using ModelMapper使用 ModelMapper 的 SOAP 请求映射
【发布时间】:2019-04-23 16:07:47
【问题描述】:

我正在尝试使用 org.modelmapper.ModelMapper 将 SOAP 请求映射到 Java POJO

但是,由于源的结构,它不起作用,它有一个字符串列表....

下面是 3 个主要组件的 sn-p 源 soap 消息、目标 DTO Java POJO 和服务端点映射逻辑。

@XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "EventRequestBodyType", propOrder = {
        "content"
    })
    public class EventRequestBodyType {

        @XmlElementRefs({
            @XmlElementRef(name = "field1", namespace = "http://x.y.z.event", type = JAXBElement.class, required = false),
            @XmlElementRef(name = "field2", namespace = "http://x.y.z.event", type = JAXBElement.class, required = false),
            @XmlElementRef(name = "field3", namespace = "http://x.y.z.event", type = JAXBElement.class, required = false),
            @XmlElementRef(name = "field4", namespace = "http://x.y.z.event", type = JAXBElement.class, required = false),
            @XmlElementRef(name = "field5", namespace = "http://x.y.z.event", type = JAXBElement.class, required = false)
        })
        protected List<JAXBElement<? extends Serializable>> content;

        /**
         * Gets the rest of the content model. 
         * 
         * <p>
         * Objects of the following type(s) are allowed in the list
         * {@link JAXBElement }{@code <}{@link String }{@code >}
         * {@link JAXBElement }{@code <}{@link String }{@code >}
         * {@link JAXBElement }{@code <}{@link String }{@code >}
         * {@link JAXBElement }{@code <}{@link BigInteger }{@code >}
         * {@link JAXBElement }{@code <}{@link String }{@code >}
         * 
         * 
         */
        public List<JAXBElement<? extends Serializable>> getContent() {
            if (content == null) {
                content = new ArrayList<JAXBElement<? extends Serializable>>();
            }
            return this.content;
        }

    }

这是 POJO(我要映射到的)

import lombok.Data;

@Data
public class EventDTO {        
    private String field1;        
    private String field2;
    private String field3;
    private String field4;
    private String field5;
}

下面是我的服务中的代码 sn-p,做映射:

if(null!= soapEventRequest.getRequestBody()) {    
    EventRequestBodyType eventRequestBodyType =
                            soapEventRequest.getRequestBody();        
    EventDTO event  = modelMapper.map(eventRequestBodyType,EventDTO.class);
    eventBody.setEventRegisterAssessment(event);           
}

如何将我的 EventDTO 映射到 EventRequestBodyType.getContent() 中返回的 5 个字段。任何想法都会受到欢迎。我的捐助者必须使用 RoleMapper 库,欢迎任何方法或建议。在此先感谢

【问题讨论】:

    标签: java soap jackson-databind modelmapper jaxb2-maven-plugin


    【解决方案1】:

    在这种情况下,使用 ModelMapper 可能不会给您带来任何大的好处 - 这意味着您也可以在没有它的情况下轻松地进行此映射 - 但如果您想将其用于约定或有人无法拦截该过程在ModelMapper 尝试映射之前,我提出了一个选项。

    借助 ModelMapper,您可以实现一个接口 org.modelmapper.Converter 来执行更复杂的映射。

    我做了一些假设,这可能不直接满足您的需求,但实现可能类似于:

    public class MyConverter implements Converter<EventRequestBodyType, EventDTO> {
    
        public EventDTO convert(MappingContext<EventRequestBodyType, EventDTO> context) {
            List<JAXBElement<? extends Serializable>> l = context.getSource().getContent();
            final EventDTO dest = new EventDTO();
            l.stream().forEach(src -> setFieldvalue(src, dest));
            return dest;
        }
    
        private void setFieldvalue(JAXBElement<? extends Serializable> src, EventDTO dest)
                throws RuntimeException {
            try {
                // Just an example how the corresponding field could be determined, 
                // maybe you need to do some other tricks also with QName
                Field f = EventDTO.class.getDeclaredField(src.getName().toString());
                f.setAccessible(true);
                // Here i assume that value can be just a String
                f.set(dest, src.getValue().toString());
            } catch (NoSuchFieldException | IllegalAccessException e) {
                // Wrapping any checked exception to unchecked for lambda
                throw new RuntimeException(e);
            }
        }
    
    }
    

    那就只是告诉ModelMapper使用它:

    ModelMapper mm = new ModelMapper();
    mm.addConverter(new MyConverter());
    EventDTO event  = modelMapper.map(eventRequestBodyType ,EventDTO.class);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 2015-08-02
      • 1970-01-01
      相关资源
      最近更新 更多