【问题标题】:JSONProvider namespaceMap config in web.xml for Apache CXFApache CXF 的 web.xml 中的 JSONProvider namespaceMap 配置
【发布时间】:2015-11-23 19:35:51
【问题描述】:

我需要通过 Apache CXF 中的 web.xml 文件将 namespaceMap 传递给 JSONProvider 配置。

我不在这个应用程序上使用 Spring,也不像这个问题建议的那样对 Providers 进行编程配置:CXF: No message body writer found for class - automatically mapping non-simple resources

宁愿使用this non-Spring example from the CXF code风格的配置。

但是,该示例没有显示如何提供namespaceMap,我不确定如何以该配置样式指定地图。

我将继续进行一些试错。

有人知道JSONProvider 配置语法的参考指南(通过web.xmlweb.xml)吗?

【问题讨论】:

    标签: json jax-rs cxf


    【解决方案1】:

    我找不到参考指南,但通过一些代码探索和this mailing list thread from the archives 设法解决了配置问题。

    由于某种原因,来自该邮件列表线程的建议不起作用(它忽略了来自 web.xml 的自定义 JSONProvider)。我可能还有其他问题。

    最终,我放弃了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.
    
      }
    

    关于让基于 Jettison 的 JSON 在 CXF 中工作的最后一点说明:您还需要在类路径中添加 cxf-rt-rs-extension-providers-X.Y.Z.jar。 CXF WHICH_JARS 文件中没有记录,但这是必需的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 2016-03-19
      • 2019-04-26
      相关资源
      最近更新 更多