Web Services 减少SOAP客户端中的耦合

hfsqlsce  于 2022-11-15  发布在  其他
关注(0)|答案(2)|浏览(147)

目前我们使用jax-ws来创建和使用SOAP Web服务,通过wsimport目标生成java类。
然后,我们创建一个Service类来调用此Web服务。Service类中的代码如下:

public WebServiceRS webServiceCall() {
  
    Security security = SecurityFactory.getTokenSecurity();
    MessageHeader header = MessageHeaderFactory.getMessageHeader(SERVICE_ACTION);

    LOGGER.info("Calling CreatePassengerNameRecordRQ webService ...");

    Holder<Security> securityHolder = new Holder<>(security);
    Holder<MessageHeader> headerHolder = new Holder<>(header);

    addHandlers(port);

    WebServiceRS webServiceRS = port.webServiceRQ(
            headerHolder,
            securityHolder,
            getRequestBody()
    );

    ...

    return webServiceRS 
}

因此,我们注意到,此Service类依赖于.wsdl生成的文件(如Security、MessageHeader、WebServiceRS等),这可能会产生问题。因此,当我们将.wsdl文件更新为较新版本时,代码最终会因为这种依赖性而中断。
我们试图实现的是一种反转这种依赖关系的方法,这样我们就可以在不改变服务类的情况下更新Web服务(即wsdl生成的类)。我们遇到问题是因为我们还没有找到解决这个问题的模式。主要的困难似乎来自于我们不能改变这些生成的类来实现一个接口作为例子。
我们感兴趣的是可以解开这种耦合的模式或最佳实践。

s4n0splo

s4n0splo1#

解决方案1.使用Adapter pattern

在您的情况下,服务的契约将发生变化,您需要同步两个不同的对象。适配器将为其主体提供不同的接口。
1.为客户端模型创建接口

public interface ClientModel {
    String getValue();
}

1.创建将DTO转换为ClientModel的适配器

public class ClientModelAdapter implements ClientModel {
    private DTO dto;
    
    public ClientModelAdapter(DTO dto) {
        this.dto = dto;
    }

    @Override
    public String getValue() {
        return dto.getValue();
    }
}

public class DTO {
    private String value;

    public String getValue() {
        return value;
    }
}

What is the exact difference between Adapter and Proxy patterns?

解决方案2.使用Map器模式

您只需在DTOClientModel之间创建Map器

public class ClientModelMapper {
    ClientModel map(DTO dto) {
        ClientModel clientModel = new ClientModel();        
        clientModel.setValue(dto.getValue());
        return clientModel;        
    }
}

传输数据的Map器组件,确保DTO和客户机模型不需要相互了解。
在这种情况下,可以使用MapStruct框架来避免手工Map。

解决方案3.使服务API向后兼容

也许您可以避免破坏SOAP服务中的更改,并使API向后兼容。Backwards compatibility and Web Services

b91juud3

b91juud32#

你可以在一个代理类的后面放进去,这样你唯一需要适应.wsdl文件变化的就是代理类了。

相关问题