Java 使用ModelMapper的SOAP请求映射

Java 使用ModelMapper的SOAP请求映射,java,soap,jackson-databind,modelmapper,jaxb2-maven-plugin,Java,Soap,Jackson Databind,Modelmapper,Jaxb2 Maven Plugin,我正在尝试使用org.modelmapper.modelmapper将SOAP请求映射到Java POJO 但是,由于源代码的结构,它无法工作,它有一个字符串列表 下面是源soap消息、目标DTO Java POJO和服务端点映射逻辑的3个主要组件的代码段 @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "EventRequestBodyType", propOrder = { "content" })

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

但是,由于源代码的结构,它无法工作,它有一个字符串列表

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

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

    }
下面是我的服务中执行映射的代码片段:

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

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

在这种情况下,使用
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
尝试映射之前,如果有人无法拦截该过程,我将提供一个选项

使用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 mm = new ModelMapper();
mm.addConverter(new MyConverter());
EventDTO event  = modelMapper.map(eventRequestBodyType ,EventDTO.class);