java - 对象作为 Apache CXF REST 服务方法中的参数

标签 java web-services rest cxf

我真正需要做的是在用 Apache CXF 编写的 REST API 中使用 Web 服务方法来接受如下请求(最好指定自定义对象作为参数类型)

{ "action":"读", "资源:"新资源" }

现在我的方法可以执行相同的操作,但它需要一个 JSON 字符串作为请求正文。但我需要服务向客户端描述请求参数。这意味着在 wadl 定义中它应该显示应从客户端发送的确切参数。理想的定义类似于

<resource path="by-attrib">
  <method name="GET">
    <request>
     <param name="Accept" style="header" type="xs:string"/>
     <param name="Auth_Type" style="header" type="xs:string"/>
     <param name="Authorization" style="header" type="xs:string"/>
     <representation mediaType="application/json">
        <param name="action" style="plain" type="xs:string"/>
        <param name="resource" style="plain" type="xs:string"/>            
     </representation>
   </request>
   <response>
    <representation mediaType="application/json">
      <param name="result" style="plain" type="xs:string"/>
    </representation>
   </response>
</method>
</resource>

CXF 可以实现这一点吗? 请注意,使用 @FormParam 不是我所需要的,如果我使用表单参数,我在使用 XML 向同一方法发送请求时会遇到问题

谢谢

最佳答案

CXF 和 Jackson 的示例

服务接口(interface)(使用POST,而不是GET)

@POST
@Path("/yourservice")
@Consumes({ MediaType.APPLICATION_JSON})
@Produces({
        MediaType.APPLICATION_JSON,
        MediaType.APPLICATION_XML})
public Result postYourService(YourData data) throws WebApplicationException;

服务实现(没什么特别的)

public Result postYourService(YourData data){
     Result r = new Result();
     r.setResult("result");
     return r; 
}

数据对象(使用jaxb简化json或xml的编码/解码)

@XmlRootElement(name = "YourData")
public class YourData {
    private String action;
    private String resource;
    //getter & setters
}

@XmlRootElement(name = "Result")
public class Result {
    private String result;
    //getter & setters
}

CXF服务器和jackson的spring配置。 Jackson 提供程序类别取决于您使用的 CXF 版本。因此,如果 JacksonJaxbJsonProvider 不在您的 cxf 包中,请查看文档

<jaxrs:server id="yourServiceREST" address="/services">
        <jaxrs:serviceBeans>
            <ref bean="yourService" />
        </jaxrs:serviceBeans>

        <jaxrs:providers>
            <!--<ref bean="authenticationFilter" />-->
            <!--<ref bean="exceptionMapper" />-->
            <!-- <ref bean="corsFilter" /> -->
            <ref bean="jackson" />
        </jaxrs:providers>
    </jaxrs:server>

<bean id="yourService" class="YourServiceImpl">
</bean>

<bean id="jackson" class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider" />

尝试部署并调用

POST /services/yourservice
{  "action":"read", "resource:"new resource"}

我不知道 WADL 是否能够正常生成,因为有时 CXF 会失败。祝你好运!

关于java - 对象作为 Apache CXF REST 服务方法中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37375275/

相关文章:

ruby-on-rails - REST API 用户速率限制的最佳实践?

c# - Azure Blob 存储 : How to enumerate blobs in long-running and recoverable fashion?

php - 来自 curl php 的资源 ID #2 响应

java - gson.toJson(Collection) 的问题

java - Spinner 仅根据用户操作更新

java - 无法在 Eclipse Neon 上安装 TestNG。提示输入用户名和密码

web-services - 从 Axis2 Web 服务内部设置 javax.net.ssl.trustStore

java - 从父类(super class)调用子类构造函数

java - 如何在我的 android studio 应用程序中实现 TLS V1.1 和 V1.2?

c# - 在 C# 中将参数传递给 Web 服务方法