簡體   English   中英

如何將POJO類用於帶有CXF的其余WS

[英]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;
    }
    }

題:

  1. 我如何在客戶端代碼中檢索/訪問返回的引用?

    字符串responseStr = agentLogoutResponse.readEntity(); //我也需要在客戶端代碼中創建pojo類/接口嗎?

  2. 此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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM