用于POJO对象的JAX-RS通用工厂

时间:2014-04-17 14:20:21

标签: java generics reflection jersey jax-rs

我试图解决以下继承问题。我有一个Web服务,有几个类可以通过URI访问: 例如URI:

http://localhost:8080/WebApp/data/someData/1

将HTTP GET-Request作为application / xml返回,如下所示:

<someData>
    <name>Very Important Data</name>
    <id>2</id>
    <description>Second Test Data</description>
</someData>

在我的SomeData类中,我有一个静态方法,它将上面给出的URI转换为SomeData对象。该方法如下所示:

public static SomeData create(URI resourceUri) {

    ClientConfig clientConfig = new DefaultClientConfig();
    clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
    Client client = Client.create(clientConfig);
    WebResource webResource = client.resource(resourceUri);

    SomeData someData = webResource.accept(MediaType.APPLICATION_XML).get(SomeData.class);

    return someData;        
}

到目前为止这是有效的。但是我有几个这样的数据类,每次创建新的数据对象时我都不想写这个方法。因为我的理解 该方法对于所有对象都是相同的,除了一行只有返回类型和类描述因对象而异:

SomeData someData = webResource.accept(mediaType).get(SomeData.class);

现在我最初的想法是创建一个继承树,其中根类(即父类)具有类似上述创建方法的方法。 那么他们只有一次实现此方法并将其用于从基类继承的所有类吗? 我的直觉告诉我,这不起作用,但我可能是错的。

也许更好的解决方案是创建一个具有创建对象的Class参数的静态工厂方法。像这样:

public class SomeDataFactory {

    public static SomeDataParent create(URI resourceUri, Class<? extends SomeDataParent> clazz) {

        ClientConfig clientConfig = new DefaultClientConfig();
        clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
        Client client = Client.create(clientConfig);
        WebResource webResource = client.resource(resourceUri);

        SomeDataParent someData = webResource.accept(MediaType.APPLICATION_XML).get(clazz);

        return someData;        
    }
}

我会这样称呼:

SomeData someData = (SomeData) SomeDataFactory.create(new URI(http://localhost:8080/WebApp/data/someData/1), SomeData);

这只是一次可行(例如良好且有效)的解决方案吗?我仍然需要在没有任何共同点的对象之间继承 除此之外,它们可以从URI创建。

通过这种方法,我不喜欢你必须为创建方法添加一个强制转换。我的意思是应该清楚这个方法创建的是什么因为我传递了类的 对象我想要创建。

赞赏任何意见。

问候

1 个答案:

答案 0 :(得分:1)

实际上,您的代码可以通过这种方式得到改进,您不需要继承不相关的实体(这是非常糟糕的设计决策)和任何强制转换。解决方案 - 泛型。首先我看了JavaDoc for WebResource.Builder#get method。它给了我一个线索,我想出了以下代码,它编译时没有任何警告,也没有包含演员表:

public static <T> T create(URI resourceUri, Class<T> clazz) {

    ClientConfig clientConfig = new DefaultClientConfig();
    clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
    Client client = Client.create(clientConfig);
    WebResource webResource = client.resource(resourceUri);

    T someData = webResource.accept(MediaType.APPLICATION_XML).get(clazz);

    return someData;        
}

所以对上面方法的调用将是这样的:

SomeData someData = SomeDataFactory.create(yourUri, SomeData.class);

SomeOtherData someOtherData = SomeDataFactory.create(yourUri, SomeOtherData.class);
祝你好运!