代码之家  ›  专栏  ›  技术社区  ›  Rishi Salunkhe

Jersey客户端不返回或读取来自多个类对象的响应

  •  0
  • Rishi Salunkhe  · 技术社区  · 8 年前

    我的web服务从多个实体返回响应。但当我用回应阅读回应时。readEntity(A.class)。注意,类A包含类B和类C的依赖关系。当我从上述语句中读取响应时,我只能读取类A的内容。

    你能帮我解决这个问题吗。

    以下是我的Java Pojo代码

    @XmlRootElement(name = "TA_TESTPATTERN")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class TAPattern {
        private User User;
        private String TP_Type;
        private String Car;
        private String Category;
        private String Description;
        private TestCase TestCase;
        private String status;
        private String Customizable_Field;
        private RESULT_COLLECTION RESULT_COLLECTION;
        private String Id;
        private String xmlns;
        private String Variant;
        private String Code;
    

    在这里 RESULT_COLLECTION 是另一个类让我们说 B RESULT_COLLECTON 再次包含类对象数组的依存关系 RESULT . 方法 结果_集合 包含的数组 结果 类数组。所以在我的课堂上 TAPattern A 结果_集合 和类 结果 C . 测试用例是这样说的 D

    以下是我的jersey客户代码:

    Response response = invocationBuilder.header("Content-Type", "application/xml")
            .post(Entity.entity(vstpattern, MediaType.APPLICATION_XML));
    return response.readEntity(TAPattern.class);
    

    以下是POJO类 , 结果 和测试用例:

    @XmlRootElement(name = "RESULT_COLLECTION")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class RESULT_COLLECTION {
        private Result[] Result;
    }
    
    @XmlRootElement(name = "Result")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Result {
        private String Method;
        private String Href;
        private String Rel;
    }
    
    @XmlRootElement(name = "TestCase")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class TestCase {
        private String Method;
        private String Href;
        private String Rel;
    }
    

    ConfigPropertyHandler configPropertyHandler = ConfigPropertyHandler.getInstance();
            ClientConfig config = new ClientConfig();
            HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic(configPropertyHandler.getTid(),
                    configPropertyHandler.getPassword());
            Client client = ClientBuilder.newClient(config);
            client.register(feature);
    
            WebTarget webTarget = client.target(configPropertyHandler.getVstUrl()).path(configPropertyHandler.getVstPath());
            Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_XML);
    
            Response response = invocationBuilder.header("Content-Type", "application/xml")
                    .post(Entity.entity(vstpattern, MediaType.APPLICATION_XML));
            //return 0;
    
    
            return response.readEntity(TAPattern.class);
    
        }
    

    以下是xml邮递员请求:

     <TA_TESTPATTERN xmlns="http://examples.com" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <Car>MyCar</Car>
            <Id>122</Id>
            <Code>myCode</Code>
            <Description> TA TEST</Description>
            <TP_Type>VF</TP_Type>
            <Category>0</Category>
            <Variant>0</Variant>
            <Customizable_Field> nda </Customizable_Field>
            <status>w</status>
            <RESULT_COLLECTION>
                <Result>
                    <Href>http://examples.com</Href>
                    <Method>GET</Method>
                    <Rel>READ</Rel>
                </Result>
                <Result>
                    <Href>http://examples.com</Href>
                    <Method>GET</Method>
                    <Rel>READ</Rel>
                </Result>
            </RESULT_COLLECTION>
            <TestCase>
                <Href>http://examples.com</Href>
                <Method>GET</Method>
                <Rel>READ</Rel>
            </TestCase>
            <User>
                <ID>f10711a</ID>
                <email>abc@external.com</email>
                <Name>abc</Name>
            </User>
        </TA_TESTPATTERN>
    

    以下是我的TA_模式

    @XmlRootElement(name = "TA_TESTPATTERN")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class TAPattern {
    
    
        @XmlElement(name = "User")
        private User User;
    
        @XmlElement(name = "TP_Type")
        private String TP_Type;
    
        @XmlElement(name = "Car")
        private String Car;
    
        @XmlElement(name = "Category")
        private String Category;
    
        @XmlElement(name = "Description")
        private String Description;
    
        @XmlElement(name = "TestCase")
        private TestCase TestCase;
    
        @XmlElement(name = "status")
        private String status;
    
        @XmlElement(name = "Customizable_Field")
        private String Customizable_Field;
    
        @XmlElement(name = "RESULT_COLLECTION") RESULT_COLLECTION RESULT_COLLECTION;
    
        @XmlElement(name = "Id")
        private String Id;
    
        @XmlElement(name = "xmlns")
        private String xmlns;
    
        @XmlElement(name = "Variant")
        private String Variant;
    
        @XmlElement(name = "Code")
        private String Code;
    

    以下是VSTTAPattern的POJO

    @XmlRootElement(name = "TA_TESTPATTERN")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class VSTTAPattern {
    
    
            private User User;
    
            private String TP_Type;
    
            private String Car;
    
            private String Category;
    
            private String Description;
    
            private TestCase TestCase;
    
            private String status;
    
            private String Customizable_Field;
    
            private RESULT_COLLECTION RESULT_COLLECTION;
    
            private String Id;
    
            private String xmlns;
    
            private String Variant;
    
            private String Code;
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   dsp_user    8 年前

    我强烈建议您通过完全删除RESULT_集合并向TAPattern类添加结果对象列表来更改设计。

    class TAPattern{
    
    ...
    @XmlElement
    private List<Result> resultList;
    }
    
    public List<Result> getResultList(){
    if(resultList==null)
        resultList = new ArrayList<Result>();
    
     return resultList;
    }
    
    @XmlAccessorType(XmlAccessType.FIELD) 
    class Result {
    ....
    }
    

    这将使设计更加简洁。也就是说,我不确定如何在服务器上生成xml响应,可能还有一些约束我不知道。

    更新:下面的代码适用于我。

    ClientConfig config = new ClientConfig();
    
            Client client = ClientBuilder.newClient(config);
    
            WebTarget target = client.target(UriBuilder.fromUri("http://localhost:8088/JerseyRest").build());   
    
            User u = new User();
            u.email = "xx@xx.com";
            u.ID = "sjdgzuauoj";
            u.Name = "user name";
            TestCase tc = new TestCase();
            tc.Href = "yyyy@hreg.com";
            tc.Method = "POST";
            tc.Rel = "link@link.com";
    
            Result[] rArr = new Result[]{ new Result(), new Result()};
            rArr[0].Href = "href@href.com";
            rArr[0].Method = "GET";
            rArr[0].Rel = "READ";
    
            rArr[1].Href = "href@href1.com";
            rArr[1].Method = "POST";
            rArr[1].Rel = "WRITE";
            RESULT_COLLECTION rCol = new RESULT_COLLECTION();
    
            rCol.Result = rArr;
            TAPattern req = new TAPattern();
            req.RESULT_COLLECTION = rCol;
            req.Car = "Volvo";
            req.Category = "0";
            req.Code = "1";
            req.Customizable_Field = "0";
            req.Description = "Test";
            req.status = "Y";
            req.Variant = "0";
            req.TestCase = tc;
            req.User = u;
            //GenericType<List<TAPattern>> taList = new GenericType<List<TAPattern>>() {};
            try{
    
            // Get XML for application   
           Response res = target.path("rest").path("UserService").path("xxxr").request()
                    .accept(MediaType.APPLICATION_XML).post(Entity.entity(req, MediaType.APPLICATION_XML),Response.class);
    
            TAPattern ta = (TAPattern)res.readEntity(TAPattern.class);
           for(Result r : ta.RESULT_COLLECTION.Result ){
               System.out.println("Href: "+r.Href);
               System.out.println("Rel: "+r.Rel);
               System.out.println("Mehod: "+r.Method);
           }
    
        }catch(Exception e){
            System.out.println(e);
            return;
        }
    

    您可能没有正确填充TAPattern对象,因此没有将所有内容都返回。