gpt4 book ai didi

java - 如何将 POJO 类用于 CXF 的其余 WS

转载 作者:行者123 更新时间:2023-11-30 03:11:30 25 4
gpt4 key购买 nike

我正在尝试将 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;
}
}

问题:

  1. 我如何检索/访问客户端代码中返回的引用?

    String responseStr=agentLogoutResponse.readEntity();//我是否也需要在客户端代码中创建 pojo 类/接口(interface)..?

  2. 此 POJO 引用是否在 CXF 中呈现为 JSON?如果是的话我们如何在客户端代码中使用它?

谢谢

最佳答案

1) 您可能想要 MessageBodyWriter<ResponseEvent>在服务器端。您可能需要register这个@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 客户端(自 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);

关于java - 如何将 POJO 类用于 CXF 的其余 WS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33547513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com