我需要通过Apache中的namespaceMap
文件向JSONProvider配置传递一个web.xml
。
我没有在这个应用程序上使用Spring,也没有像这个问题建议的那样对提供程序进行编程配置:CXF:没有为类自动映射非简单资源找到消息体编写器
而是使用这个来自CXF代码的非Spring示例样式的配置。
但是,该示例没有说明如何提供namespaceMap
,我也不确定如何以这种配置方式指定映射。
我要试一试。
任何人都知道JSONProvider
配置语法的参考指南(通过web.xml
)。
发布于 2015-12-01 09:25:13
我找不到参考指南,但通过一些代码搜索和来自档案馆的邮件列表线程解决了配置问题。
出于某种原因,来自邮件列表线程的建议不起作用(它忽略了来自web.xml
的自定义web.xml
)。我可能有其他问题。
最终,我放弃了web.xml
配置的概念,因为它已经被用来提供一个javax.ws.rs.Application
,并且(从@ CXF代码中查找),如果CXF找到了一个应用程序,它就会忽略来自web.xml
的init-param
元素。
此外,在web.xml
配置中似乎没有一种表示Map类型的方法。这是基于线程和代码的猜测,所以我不能100%确认。
这就是我的web.xml的样子(在这些更改之前和之后相同):
<servlet>
<servlet-name>CXFServlet</servlet-name>
<display-name>CXF Servlet</display-name>
<servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>my.javax-ws-rs.Application</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
我需要在my.javax-ws-rs.Application
类中进行更改。
只需将一个新的JSONProvider
添加到其中的单点列表中:
@Override
public Set< Object> getSingletons() {
final Set< Object> singletons = new HashSet<>();
// [SNIP -- existing singletons]
singletons.add( new my.provider.MyJSONProvider() );
return singletons;
}
my.provider.MyJSONProvider
的定义是其他魔术发生的地方(是的,这是我说我没有的“编程”配置,但最终不得不求助于此):
@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON})
@Provider
public class MyJSONProvider<T> extends JSONProvider<T> {
public AdministrationUtilisatuerJSONProvider() {
{
Map<String, String> newNamespaceMap = new ConcurrentHashMap<>();
XmlSchema resource1SchemaAnnotation = Resource1.class.getPackage().getAnnotation(javax.xml.bind.annotation.XmlSchema.class);
String resource1Namespace = resource1SchemaAnnotation.namespace();
newNamespaceMap.put( resource1Namespace, "resource1JsonPrefix" );
XmlSchema resource2SchemaAnnotation = Resource2.class.getPackage().getAnnotation(javax.xml.bind.annotation.XmlSchema.class);
String resource2Namespace = resource2SchemaAnnotation.namespace();
newNamespaceMap.put( resource2Namespace, "resource2JsonPrefix" );
setNamespaceMap(newNamespaceMap);
}
// Or set this to "true" to ignore all that namespace stuff
// setIgnoreNamespaces(true);
// Don't write namespace for default xsi-type elements.
setWriteXsiType(false);
// [SNIP] -- Other JSONProvider configuration.
// Check source from CXF, but few comments in code.
}
关于使基于JSON的JSON在CXF中工作的最后一个注意事项:您还需要类路径上的cxf-rt-rs-extension-providers-X.Y.Z.jar
。CXF WHICH_JARS
文件中没有记录这一点,但这是必需的。
https://stackoverflow.com/questions/33879167
复制相似问题