![](/img/trans.png)
[英]CXF Rest Client - set ResponseReader for POJO (JAXBElement)
[英]How to use POJO class for rest WS with CXF
我正在尝试将POJO类引用返回给其余WS(CXF 3.1.2)中的客户端,如下所示,
服务方法声明:
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes({"application/xml", MediaType.TEXT_PLAIN})
@Path("/agentLogout")
public ResponseEvent agentLogout(String ext) {
ResponseEvent response= new ResponseEvent();
response.setDn(ext);
return response;
}
客户代码:
WebClient client = WebClient.create(REST_URI);
client.path("agentLogout").accept(MediaType.APPLICATION_JSON);
Response agentLogoutResponse = client.post("3101");
String responseStr=agentLogoutResponse.readEntity();
POJO:
public class ResponseEvent {
private String dn;
public String getDn() {
return dn;
}
public void setDn(String ext) {
this.dn=ext;
}
}
题:
我如何在客户端代码中检索/访问返回的引用?
字符串responseStr = agentLogoutResponse.readEntity(); //我也需要在客户端代码中创建pojo类/接口吗?
此POJO参考是否在CXF中呈现为JSON? 如果是这样,我们如何在客户端代码中使用它?
谢谢,
1)您可能希望在服务器端使用MessageBodyWriter<ResponseEvent>
。 您可能需要注册此@Provider
。 这将使您的POJO可以写入服务器的输出流。 例如(未测试):
@Provider
class ResponseEventWriter implements MessageBodyWriter<ResponseEvent> {
@Override
public boolean isWriteable(Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType) {
return true;
}
@Override
public long getSize(ResponseEvent t, Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType) {
return t.getDn().length();
}
@Override
public void writeTo(ResponseEvent t, Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders,
OutputStream entityStream) throws IOException,
WebApplicationException {
entityStream.write(t.getDn().getBytes());
}
}
2)您需要在客户端具有MessageBodyReader<ResponseEvent>
。 例如:
@Provider
public class ResponseEventReader implements MessageBodyReader<ResponseEvent> {
@Override
public boolean isReadable(Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType) {
return true;
}
@Override
public ResponseEvent readFrom(Class<ResponseEvent> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream)
throws IOException, WebApplicationException {
StringBuilder sb = new StringBuilder();
try(InputStreamReader isr = new InputStreamReader(entityStream)) {
char[] c = new char[1];
while (isr.read(c) != -1)
sb.append(c);
} catch (IOException e) {
//do something
}
ResponseEvent event = new ResponseEvent();
event.setDn(sb.toString());
return event;
}
}
您需要在客户端上注册此提供程序。 例如,您使用JAXRS client而不是cxf client(自cxf 3起可用)执行此操作,例如使用以下命令:
Client client = ClientBuilder.newClient();
client = client.register(ResponseEventReader.class);
Response agentLogoutResponse = client.target(/*whateveryourpath + */ "agentLogout")
.request().accept(MediaType.APPLICATION_JSON)
.buildPost(Entity.text("1301")).invoke();
然后,您可以将您的实体读取为
ResponseEvent event = agentLogoutResponse.readEntity(ResponseEvent.class);
假设您已经在客户端创建了接口(可以使用WADL2Java插件自动生成接口)。
public interface MyService{
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes({"application/xml", MediaType.TEXT_PLAIN})
@Path("/agentLogout")
public ResponseEvent agentLogout(String ext);
}
创建一个单例类并创建服务实例
public class CxfRestSingleton {
public static GenService obj;
public static GenService getInstance() {
if (obj == null) {
obj = JAXRSClientFactory.create("http://localhost:8080/api/hello", MyService.class, Arrays.asList(new JacksonJaxbJsonProvider()));
}
return obj;
}
}
**注意:**这里我使用的是Jackson JAXB JSON provivder,它可以对XML和JSON进行封送/解组,您可以使用提供者的选择。 Jackson提供程序不是cxf的一部分,因此您需要单独包括这些依赖项
您可以如下所示访问pojo类
CxfRestSingleton.getInstance().agentLogout(12345).getDn();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.