对象作为 Apache CXF REST 服务方法中的参数
Objects as parameters in Apache CXF REST service method
我真正需要做的是在 REST API 中使用 Apache CXF 编写的 Web 服务方法来接受如下请求(最好将自定义对象指定为参数类型)
{
"action":"read",
"resource:"new resource"
}
现在我的方法可以做同样的事情,但它需要一个 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 向相同方法
发送请求时遇到问题
谢谢
其实我找到了答案
是用bean注入
在他们的文档中描述,很抱歉不是 RTFM
http://cxf.apache.org/docs/jax-rs-basics.html
在参数 Bean 下
基本思想是使用一个 java Bean(带有 setter 和 getter 的零参数构造函数)并将其添加到 Web 服务参数中
但是您需要指定 @QueryParam
@FormParam
@PathParam
之一才能工作
CXF 和杰克逊的例子
服务接口(使用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的encoding/decoding)
@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 提供者 class 取决于您使用的是哪个版本的 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会失败。走运!
我真正需要做的是在 REST API 中使用 Apache CXF 编写的 Web 服务方法来接受如下请求(最好将自定义对象指定为参数类型)
{
"action":"read",
"resource:"new resource"
}
现在我的方法可以做同样的事情,但它需要一个 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 向相同方法
发送请求时遇到问题谢谢
其实我找到了答案
是用bean注入
在他们的文档中描述,很抱歉不是 RTFM
http://cxf.apache.org/docs/jax-rs-basics.html
在参数 Bean 下
基本思想是使用一个 java Bean(带有 setter 和 getter 的零参数构造函数)并将其添加到 Web 服务参数中
但是您需要指定 @QueryParam
@FormParam
@PathParam
之一才能工作
CXF 和杰克逊的例子
服务接口(使用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的encoding/decoding)
@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 提供者 class 取决于您使用的是哪个版本的 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会失败。走运!