Java 使用ModelMapper的SOAP请求映射
我正在尝试使用org.modelmapper.modelmapper将SOAP请求映射到Java POJO 但是,由于源代码的结构,它无法工作,它有一个字符串列表 下面是源soap消息、目标DTO Java POJO和服务端点映射逻辑的3个主要组件的代码段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" })
@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);