java - 使用 ModelMapper 的 SOAP 请求映射
问题描述
我正在尝试使用 org.modelmapper.ModelMapper 将 SOAP 请求映射到 Java POJO
但是,由于源的结构,它不起作用,它有一个字符串列表....
下面是 3 个主要组件的代码片段,源肥皂消息、目标 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 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);
推荐阅读
- vue.js - nuxt 在点击 this.$auth.fetchUser() 后获取用户名
- datatable - 从 SLT 表中删除部分数据
- html - 一些但不是所有的自定义 CSS 覆盖 Bootstrap 4 设置
- google-cloud-platform - 如何获取 GCP 云功能 CPU 时间统计信息
- reactjs - 函数句柄中的状态更新问题
- c++ - SWIG 和 C++ 枚举类
- javascript - 如何将 highchart 导航器和图形聚焦到结果集的一部分
- php - 将我的插件连接到 woo 商务支付系统
- python - 如何将我的腌制 ML 模型从 GCS 加载到 Dataflow/Apache Beam
- rabbitmq - 在 debian 中的 rabbitmq 上添加用户显示 /usr/lib/rabbitmq/bin/rabbitmqctl: dirname: not found