java—如何处理没有共享接口的等效对象

5hcedyr0  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(226)

我有一段代码,我想概括,但我不知道如何实现。我的程序处理许多具有相同getter/setter但不共享接口的jaxbelement类,这些类需要在将它们发送到web服务之前设置属性。在不久的将来,相同类型的类的数量可能会增加。这可以用泛型来概括,还是需要动态代理?

public class ServiceClient1 {
    public Response getResponse(ReqObject1 req1) {
        req1.getValue().setConfig("john","doe");
        return client.target(endpoint).request(MediaType.TEXT_XML).post(Entity.entity(req1, MediaType.TEXT_XML);
    }
    public RespObject1 readResponse(Response resp1) {
        return resp1.readEntity(RespObject1.class);
    }
}

变成这样

public class ServiceClient {
    public <T> Response getResponse(T req) {
        req.getValue().setConfig("john","doe");
        return client.target(endpoint).request(MediaType.TEXT_XML).post(Entity.entity(req, MediaType.TEXT_XML);
    }
    public <T> T readResponse(Response resp) {
        return resp.readEntity(T.class);// ???
    }
}
mqkwyuun

mqkwyuun1#

谢谢普拉桑纳。反射解决方案可能是实现共享接口的 Package 类的一个很好的替代方案。

yiytaume

yiytaume2#

处理getresponse()

方案1:
如果您的请求类可以实现一个公共接口,那么可以完全使用泛型来处理这个方法。
接口和类定义:

interface Configurable {
    void setConfig(String s1, String s2);
}

public class Req1 implements Configurable {
    @Override
    public void setConfig(String s1, String s2) {
    }
}

public class Req2 implements Configurable {
    @Override
    public void setConfig(String s1, String s2) {
    }
}

getresponse()实现:

public <T extends Configurable> Response getResponse(JAXBElement<T> req) {
    req.getValue()
       .setConfig("john", "doe");
    return client.target(endpoint)
                 .request(MediaType.TEXT_XML)
                 .post(Entity.entity(req, MediaType.TEXT_XML));
}

注意:根据您的示例,输入参数的类型似乎总是 JAXBElement .
方案2:
如果您无法实现所有请求类 Configurable 我们需要用反射来推广这种方法。

public Response getResponse(JAXBElement<?> req) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
    Object instance = req.getValue();
    Method m = instance.getClass()
                       .getMethod("setConfig", String.class, String.class);
    m.invoke(instance, "john", "doe");
    return client.target(endpoint)
                 .request(MediaType.TEXT_XML)
                 .post(Entity.entity(req, MediaType.TEXT_XML));
}

注意:为了简洁起见,我让方法重新抛出异常。我们可以使用自定义异常并适当地处理它。

处理readresponse()

这个方法完全可以使用泛型来处理。只需为返回类型再传递一个参数。

public <T> T readResponse(Response response, Class<T> cls) {
    return response.readEntity(cls);
}

相关问题