代码之家  ›  专栏  ›  技术社区  ›  Anirban Sen Chowdhary

如何构造WADL文件以获得以下Java接口

  •  2
  • Anirban Sen Chowdhary  · 技术社区  · 11 年前

    我对REST服务很陌生。。我想创建一个WADL,将其转换为Java接口,以创建和公开Rest web服务。。所以我需要创建一个WADL来获得以下java接口:-

    @Path("/getData")
    public interface MainData {
    
    
        @GET
        @Produces("application/json")
        @Path("/retrieve/")
        public DataResponse retrieveDataOperation(@QueryParam("id") int id);
    
        @POST
        @Produces("application/json")
        @Path("/insert/")
        public DataResponse insertDataOperation(String message);
    
        @PUT
        @Produces("application/json")
        @Path("/update/")
        public DataResponse updateDataOperation(String message);
    
        @DELETE
        @Produces("application/json")
        @Path("/delete/")
        public DataResponse deleteDataOperation(@QueryParam("id") int id);
    
    }
    

    到目前为止,我尝试创建以下WADL以获得上述接口:-

    <application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://wadl.dev.java.net/2009/02 wadl.xsd"
        xmlns:ns1="http://services.test.com/schema/bs/bom/v01/GetAllTypeDesignators"
    
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://wadl.dev.java.net/2009/02">
    <grammars>
      <include href="MainData.xsd" />
    </grammars>
    
    <resources base="http://localhost:8082">
    
    <resource path="getData" id="com.test.services.schema.maindata.v1.MainData">
    
            <resource path="/retrieve/" >
                 <method name="GET" id="retrieveDataOperation">
                    <request>
                        <param  type="xs:int" style="query" name="id"/>
                    </request>
                    <response>
                         <representation mediaType="application/json" element="ns1:DataResponse"/>
                     </response>
                   </method>
            </resource>
    
       <resource path="/delete/" >
         <method name="DELETE" id="deleteDataOperation">
            <request>
              <param  type="xs:int" style="query" name="id"/>
             </request>
           <response>
             <representation mediaType="application/json" element="ns1:DataResponse"/>
           </response>
          </method>
        </resource>
    
       <resource path="/insert/" >
           <method name="POST" id="insertDataOperation">
              <request>
                 <param name="message" type="xs:string" />
               </request>
                   <response>
                       <representation mediaType="application/json" element="ns1:DataResponse"/>
                    </response>
                </method>
              </resource>
    
        <resource path="/update/" >
      <method name="PUT" id="updateDataOperation">
         <request>
            <param name="message" type="xs:string" />
         </request>
        <response>
          <representation mediaType="application/json" element="ns1:DataResponse"/>
        </response>
       </method>
    </resource>
    
    </resource>
    </resources>
    </application>
    

    但是在将这个WADL转换为Java之后,我无法获得上面的Java接口。。在Apache CXF中转换时,还显示以下异常:- WADLToJava Error: java.lang.NullPointerException 请帮助我修改WADL以获得上面的确切java接口。。我做得对吗。。请帮忙。。

    1 回复  |  直到 11 年前
        1
  •  3
  •   Petar Butkovic    11 年前

    我刚刚检查了你的WADL,看起来还不错,有一些小错误,但没有什么可以指出你的错误。此外,我还使用了命令行工具wadl2java;

    wadl2java -d /output/dir -interface /input/wadl/application.wadl
    

    这里是修正后的WADL;

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <application xmlns="http://wadl.dev.java.net/2009/02" xmlns:ns1="http://services.test.com/schema/bs/bom/v01/GetAllTypeDesignators">
        <grammars>
            <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://services.test.com/schema/bs/bom/v01/GetAllTypeDesignators">
                <xs:element name="dataResponse" type="ns1:dataResponse"/>
                <xs:complexType name="dataResponse">
                    <xs:sequence>
                        <xs:element name="param1" type="xs:int"/>
                        <xs:element name="param2" type="xs:string" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:schema>
        </grammars>
        <resources base="http://localhost:8082">
            <resource path="getData" id="com.test.services.schema.maindata.v1.MainData">
                <resource path="/retrieve/" >
                    <method name="GET" id="retrieveDataOperation">
                        <request>
                            <param  type="xs:int" style="query" name="id"/>
                        </request>
                        <response>
                            <representation mediaType="application/json" element="ns1:dataResponse"/>
                        </response>
                    </method>
                </resource>
                <resource path="/delete/" >
                    <method name="DELETE" id="deleteDataOperation">
                        <request>
                            <param  type="xs:int" style="query" name="id"/>
                        </request>
                        <response>
                            <representation mediaType="application/json" element="ns1:dataResponse"/>
                        </response>
                    </method>
                </resource>
                <resource path="/insert/" >
                    <method name="POST" id="insertDataOperation">
                        <request>
                            <representation mediaType="*/*">
                                <param name="message" style="plain" type="xs:string" />
                            </representation>
                        </request>
                        <response>
                            <representation mediaType="application/json" element="ns1:dataResponse"/>
                        </response>
                    </method>
                </resource>
                <resource path="/update/" >
                    <method name="PUT" id="updateDataOperation">
                        <request>
                            <representation mediaType="*/*">
                                <param name="message" style="plain" type="xs:string" />
                            </representation>
                        </request>
                        <response>
                            <representation mediaType="application/json" element="ns1:dataResponse"/>
                        </response>
                    </method>
                </resource>
            </resource>
        </resources>
    </application>
    

    你应该把你的 MainData.xsd ,我敢打赌,XSD内部依赖于您的错误。

    更新:

    如果在“representation”中使用参数名称,则参数名称必须是参数类型的小写字母。我刚刚检查了wadl2java的源代码(cxf-tools-wadlto-jaxrs-3.0.1-sources.jar),并得出结论,需要修改生成器。上课时出现问题 org.apache.cxf.tools.wadlto.jaxrs.SourceGenerator:1044 看起来像 elementParamName = elementParamType.toLowerCase(); 你应该在 Apache CXF jira 或自行修改代码。

    另一种方法是设置 message 参数为 @QueryParam ,您可以通过替换;

        <representation mediaType="*/*">
            <param name="message" style="plain" type="xs:string" />
        </representation> 
    

    用这个;

        <param name="message" style="query" type="xs:string" />
    

    但在这种情况下,您的接口方法看起来像;

    @POST
    @Produces("application/json")
    @Path("/insert/")
    DataResponse insertDataOperation(@QueryParam("message") String message);
    

    希望有帮助。