Сопоставление запросов SOAP с использованием ModelMapper - PullRequest
1 голос
/ 23 апреля 2019

Я пытаюсь сопоставить SOAP-запрос с Java POJO, используя org.modelmapper.ModelMapper

Но он не работает из-за структуры источника, у него есть список строк ....

Ниже приведен фрагмент исходного сообщения мыла из трех основных компонентов, целевого 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 (что я пытаюсь сопоставитьto)

import lombok.Data;

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

Ниже приведен фрагмент кода в моем сервисе, выполняющий сопоставление:

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

Как мне сопоставить EventDTO с 5 полями, возвращенными в EventRequestBodyType.getContent ().Любые идеи будут приветствоваться.Я должен использовать библиотеку RoleMapper, любой подход или предложения приветствуются.Заранее спасибо

1 Ответ

0 голосов
/ 01 мая 2019

Использование 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);
...