我对Java世界还是比较陌生的,并且在几十个或多或少做同样事情的图书馆之间选择的美丽让我感到不知所措.
有了Jetty和CXF.我正在寻找一个内置支持各种传输和协议的Web服务堆栈.
我的印象是CXF是最近的项目,并且将成为新软件项目的首选.特别是在涉及各种不同协议和标准(如WS-*)的应用程序时.
您能否就这些框架之间的差异发表意见?
哪一个对不同的协议和标准有更广泛的支持?
您更喜欢哪一个设计,例如它们如何将应用程序逻辑中的传输,身份验证,授权,序列化方面隐藏起来?
任何一种答案都非常欢迎!
干杯,亚历克斯
我想使用WSDLToJava
的Apache的CXF在我的Ant构建文件从WSDL创建Java代码.使用Ivy解决依赖关系.我总是得到以下错误:
WSDLToJava Error: Could not find jaxb databinding within classpath
Run Code Online (Sandbox Code Playgroud)
我没有安装,想用Ivy为我做这个工作.这是我的Ant构建文件的一部分:
<target name="generate" depends="init">
<ivy:retrieve conf="build"/>
<mkdir dir="${basedir}/target/generated"/>
<ivy:cachepath pathid="build-classpath" conf="build"/>
<java classname="org.apache.cxf.tools.wsdlto.WSDLToJava" fork="true">
<arg value="-d"/>
<arg value="${basedir}/target/generated"/>
<arg value="-client"/>
<arg value="${basedir}/src/schema/MyWebService.wsdl"/>
<classpath refid="build-classpath"/>
</java>
</target>
Run Code Online (Sandbox Code Playgroud)
我使用Java 6,Ant 1.8,Ivy 2.2.0 ant CXF 2.2.12.在常春藤模块中,我配置了以下内容:
<configurations>
<conf name="build" visibility="private"/>
...
</configurations>
<dependencies defaultconfmapping="*->default">
<dependency org="org.apache.cxf" name="cxf-tools-wsdlto-frontend-jaxws" rev="2.2.12" conf="build"/>
<dependency org="org.apache.cxf" name="cxf-rt-databinding-jaxb" rev="2.2.12" conf="build"/>
...
</dependencies>
Run Code Online (Sandbox Code Playgroud)
问题出在哪儿?也许有一个依赖缺失,但哪一个?如果没有Ivy,Ant集成将使用包含CXF安装的所有jar的类路径.如果我这样做,它的确有效.
在构建的输出中,我看到以下内容:
generate (2s)
[generate] ivy:retrieve (1s)
[ivy:retrieve] :: …
Run Code Online (Sandbox Code Playgroud) 我正在使用CXF 2.5.2与Maven,它没有指定-exsh它工作正常.但是,当我这样做时说
-exsh文件:/ C:/wsdl/XXXX.wsdl不在枚举值列表中!
我不知道它的含义是什么.之后支持该选项并在Usage行上提及.我真的需要让它工作,因为一堆方法在WSDL中有soap:header元素.
我正在尝试使用Apache-CXF实现RESTful Web服务,该服务与数据库交互以通过Hibernate执行一些CRUD操作.Web服务使用Jackson JAX-RS Provider消耗和生成JSON格式的对象.
我目前正在收到一个"未能懒得初始化一个集合......没有会话或会话被关闭"的例外情况,当它试图序列化响应对象时,它正在从Jackson提供者那里冒出来.
我假设如果我标记了服务方法,@Transactional
那么当序列化响应时,Jackson会提供会话,但事实并非如此.
当Jackson在序列化期间走过对象时,如何让hibernate会话可用?
<context:component-scan base-package="com.db.cif.mapper" />
<context:component-scan base-package="com.db.cif.mapper.repository" />
<context:annotation-config />
<tx:jta-transaction-manager>
<property name="entityManagerFactory" ref="entityManagerFactory" />
</tx:jta-transaction-manager>
<tx:annotation-driven />
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="cifmapper" />
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
</property>
</bean>
<!-- JAX-RS Configuration -->
<jaxrs:server id="mappingService" address="/">
<jaxrs:serviceBeans>
<ref bean="mappingServiceBean" />
</jaxrs:serviceBeans>
<jaxrs:extensionMappings>
<entry key="json" value="application/json" />
</jaxrs:extensionMappings>
<jaxrs:providers>
<ref bean="jsonProvider" />
</jaxrs:providers>
</jaxrs:server>
<bean id="mappingServiceBean" class="com.db.cif.mapper.MappingService" />
<bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" />
Run Code Online (Sandbox Code Playgroud)
@Service("mappingService")
@Transactional …
Run Code Online (Sandbox Code Playgroud) 我将从apache CXF项目中获取一些示例http://cxf.apache.org/docs/sample-projects.html
想要检查几件事情,看看它们是如何工作的
http://svn.apache.org/viewvc/cxf/trunk/distribution/src/main/release/samples/ws_security/
但是我无法结账我收到此错误:
有没有人在之前遇到过相同/类似的问题?
我正在尝试为http://v3.core.com.productserve.com/ProductServeService.wsdl定义的Web服务生成Java客户端
我已经从CXF和Axis2尝试过Java的wsimport和wsdl2java。
例如
wsimport -p productserve -XadditionalHeaders http://v3.core.com.productserve.com/ProductServeService.wsdl
Run Code Online (Sandbox Code Playgroud)
这三个都产生具有相同问题的ApiPortType.java。getProductList方法的返回类型为void,没有@WebResult批注。WSDL中的所有其他操作都映射为java代码。
我已经详细研究了WSDL,但无法发现问题所在以及为什么所有3种工具都无法为操作生成正确的返回类型。
有任何想法吗?
我目前正在开发具有XMLBeans绑定而不是默认JAXB绑定的Apache CXF Web服务。我正在使用Java 1.6编译和运行代码。对于以下代码段,在运行时出现“ DOM Level 3 Not Implemented”错误:
ExtType[] extTypeList = p.getExtArray();
for (ExtType extType : extTypeList) {
Node node = extType.getDomNode();
NodeList objList = node.getChildNodes();
for (int i = 0; i < objList.getLength(); ++i) {
Node text = (Node) objList.item(i);
if (text.getNodeName() != null
&& text.getNodeName() == XmlConstant.NODE_NAME) {
info.setDuration(text
.getTextContent());
}
}
}
Run Code Online (Sandbox Code Playgroud)
在JBoss中显示的确切错误如下:
java.lang.RuntimeException: DOM Level 3 Not implemented
at org.apache.xmlbeans.impl.store.DomImpl._node_getTextContent(DomImpl.java:2516)
at org.apache.xmlbeans.impl.store.Xobj$NodeXobj.getTextContent(Xobj.java:2607)
Run Code Online (Sandbox Code Playgroud)
从以上错误消息中可以明显看出,由于在运行时未找到DOM 3级API,因此getTextContent方法引起了异常。如何消除此错误?我猜我将不得不弄清楚哪个jar包含DOM API,并从该jar中删除所有与dom相关的类,以便代替使用与jdk一起提供的默认DOM API。或者,是否有一种方法可以使用DOM而不依靠getTextContent方法来获取xml标记的文本内容?
在正在处理的应用程序中,org.apache.cxf.interceptor.LoggingInInterceptor当前正在将HTTP请求/响应记录到catalina.out中.
我希望它以某种方式将此信息复制到一个单独的日志文件中.有关如何做到这一点的任何指示?
我写使用CXF框架(版本:2.7.8)SOAP客户端为SharePoint 2007年我跟随添加NTLM支持的在线文档这里.我有客户工作和跟踪的HTTP会话显示NTLM凭据被发送,但是,我仍然收到401未授权的响应.
码:
Lists listService = new Lists();
ListsSoap port = listService.getListsSoap();
BindingProvider bp = (BindingProvider) port;
bp.getRequestContext().put("use.async.http.conduit", Boolean.TRUE);
Credentials creds = new NTCredentials(USER, PASS, "", DOMAIN);
bp.getRequestContext().put(Credentials.class.getName(), creds);
Client client = ClientProxy.getClient(proxy);
HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(36000);
httpClientPolicy.setAllowChunking(false);
httpClientPolicy.setAutoRedirect(true);
http.setClient(httpClientPolicy);
// Build request and execute
Run Code Online (Sandbox Code Playgroud)
有趣的是,我使用HTTP PUT为WebDAV编写了一个类似的客户端,使用Apache HTTPClient库上传文档,并且能够使用NTLM成功进行身份验证.此外,我能够使用SOAPUI来调用我正在尝试构建Java客户端的相同列表Web服务,并且它也使用NTLM成功进行了身份验证.
我假设NTLM的实现在CXF和HTTPClient之间是不同的.有关我的CXF实施有什么问题的想法?或者我如何让它镜像HTTPClient实现?
我在Spring Boot中配置我的JAXRS服务器,如下所示:
JAXRSServerFactoryBean factoryBean = new JAXRSServerFactoryBean();
factoryBean.setBus(this.bus);
factoryBean.setFeatures(singletonList(swagger2Feature()));
factoryBean.setServiceBeans(Arrays.asList(blah(), blah2(), blah3()));
factoryBean.setAddress("/api/v1/"); // HERE
List<Object> providers = new ArrayList<>();
providers.add(new JacksonJaxbJsonProvider());
factoryBean.setProviders(providers);
BindingFactoryManager manager = factoryBean.getBus().getExtension(BindingFactoryManager.class);
JAXRSBindingFactory restFactory = new JAXRSBindingFactory();
restFactory.setBus(factoryBean.getBus());
manager.registerBindingFactory(JAXRSBindingFactory.JAXRS_BINDING_ID, restFactory);
return factoryBean.create();
Run Code Online (Sandbox Code Playgroud)
但是,URL总是要求/services
在最前面,这很麻烦(但不是世界末日)。有什么方法可以删除/services
并将其部署到根上下文中吗?
cxf ×10
java ×6
jax-rs ×2
web-services ×2
ant ×1
axis ×1
dom ×1
hibernate ×1
ivy ×1
jetty ×1
ntlm ×1
sharepoint ×1
soap ×1
spring ×1
spring-boot ×1
svn ×1
tortoisesvn ×1
wsdl2java ×1
wsimport ×1
xmlbeans ×1