我正在尝试使用 org.modelmapper.ModelMapper 将 SOAP 请求映射到 Java POJO
但是,由于源的结构,它不起作用,它有一个字符串列表......
下面是 3 个主要组件源 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;
}
下面是我的服务中进行映射的代码片段:
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,您可以实现一个接口(interface) 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);
关于java - 使用 ModelMapper 进行 SOAP 请求映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55815292/