当前位置: 首页 > 知识库问答 >
问题:

在Apache CXF中动态设置启用MTOM的属性

贺劲
2023-03-14

我正在使用阿帕奇CXF框架开发肥皂网络服务。我的 Web 方法根据请求参数返回二进制数据或纯 XML。大多数请求都返回二进制数据,因此我将 CXF 配置为在服务响应中使用 MTOM。

但是这并不总是有用的:当返回XML时,调用方希望得到纯文本/xml文档,而不是多部分文档。所以我希望我的web服务能够动态地改变它的绑定。

CXF 文档包含以下示例:

Endpoint ep = ...; // example does not explain how to get it
SOAPBinding binding = (SOAPBinding)ep.getBinding();
binding.setMTOMEnabled(true); // or false

问题:如何获取Endpoint实例?

我正在对Web服务使用Spring注释@Endpoint,为Web方法使用@PayloadRoot。

共有2个答案

段干英杰
2023-03-14

我创建了自己的编组类,扩展自org.springframework.oxm.jaxb.Jaxb2Marshaller。只有一个方法被覆盖:

public class Marshaller extends Jaxb2Marshaller {
  @Override
  public void marshal(Object graph, Result result, MimeContainer mimeContainer) throws XmlMappingException {
    if ( disableMtom() ) {
      super.marshal(graph, result, null);
    } else {
      super.marshal(graph, result, mimeContainer);
    }
  }

  private boolean disableMtom() {
    return ... // depends on response context
  }
}

禁用 Mtom 检测是否从响应上下文中禁用了 MTOM。Web 服务终结点会小心地以某种方式将此上下文传递给编组程序。

默认情况下,MTOM处于启用状态。

易波涛
2023-03-14

如果您使用的是服务器,

您需要添加<code>导入javax.xml.ws.Endpoint

HelloWorldImpl implementor = new HelloWorldImpl();
String address = "http://localhost:9000/helloWorld";
Endpoint.publish(address, implementor);

从客户端

TestMtomService tms = new TestMtomService(wsdlURL, SERVICE_NAME);
TestMtomPortType port = (TestMtomPortType)tms.getPort(PORT_NAME,TestMtomPortType.class);
Binding binding = ((BindingProvider)port).getBinding();
((SOAPBinding)binding).setMTOMEnabled(true);

参考

如果您下载了cxf捆绑包,以下路径中提供了MTOMServer/Client的代码示例

apache-cxf-2.7.2\samples\mtom

 类似资料:
  • 问题内容: 我正在尝试向angular js的控制器中的div动态添加属性。 一切看起来都很好,在调试器中,我看到该属性已添加,但它不执行我的功能。您是否有任何想法如何向现有div添加属性以及如何使其起作用? 问题答案: 您需要重新编译div http://jsfiddle.net/r2vb1ahy/

  • 我能想到的唯一方法是,在不进行上述尝试的情况下,从一个字符串中设置每个属性,遍历每个属性,并使用if-else或switch-case逻辑来确定调用哪一个dataSource设置器来设置值。 那么,有没有一种方法可以在不调用每个单独的setter的情况下从字符串中动态设置这些属性呢? 当我在或中设置用户名时,它确实发生了变化,但我认为这可能是针对用户名和密码的,因为我试图设置的其他属性没有效果。

  • 还有一个Java问题(我是noob,我知道):在自定义控件中使用动态属性绑定,在JavaBean中使用动态属性getter,可能吗? 我会解释的。我在自定义控件中广泛使用此功能: 这用于将数据源和字段名称作为参数传递的控件中。这工作,到目前为止还不错。现在,在某些情况下,数据源是托管bean。当解释上述行时,显然会生成代码来获取或设置...某物的值。但具体是什么呢? 我得到这个错误:从com类型的

  • 在这里,我想在动态下拉列表中设置一个属性“selected”,当它在MVC中的HttpPost之后被单击时,它会显示相同的第一个文本“请选择一个类别”。 从HttpPost重载后,我想通过使用值来检查和设置选项标签中的属性“选择”,在Foreach循环选项标签中的动态下拉中获得“选择”属性。

  • 本文向大家介绍使用变量动态设置js的属性名,包括了使用变量动态设置js的属性名的使用技巧和注意事项,需要的朋友参考一下 目标:js的属性名可以使用变量 举例:js对象object,当赋给该对象属性的时候可以采用以下方式 也可以采用如下方式: 在这里prop1 作为属性名称,可以直接用,也可以加上引号,比如: 表达的含义都是一样的,也就是说,prop1只能作为常量被识别,即使它是个变量也没用,例如:

  • 问题内容: 我有一个对象,它可以是任何数量的深度,并且可以具有任何现有属性。例如: 在此我想设置(或覆盖)属性,如下所示: 属性字符串可以具有任何深度,并且值可以是任何类型/事物。 如果属性键已经存在,则不需要合并对象和数组作为值。 前面的示例将产生以下对象: 如何实现这种功能? 问题答案: 此函数使用您指定的参数应添加/更新容器中的数据。请注意,您需要跟踪架构中的哪些元素是容器,哪些是值(字符串