【问题标题】:JAX-RS generic factory for POJO objectsPOJO 对象的 JAX-RS 通用工厂
【发布时间】:2014-04-17 14:20:21
【问题描述】:

我正在尝试解决以下继承问题。我有一个 Web 服务,其中包含几个可以通过 URI 访问的类: 例如 URI:

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

以 application/xml 形式返回 HTTP GET-Request,如下所示:

<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 创建。

使用这种方法,我不喜欢您必须在创建方法中添加演员表。我的意思是应该清楚这个方法创建了什么,因为我传递了 我想要创建的对象。

感谢任何输入。

问候

【问题讨论】:

    标签: java generics reflection jersey jax-rs


    【解决方案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);
    

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 2011-07-30
      • 1970-01-01
      • 2012-02-05
      • 2020-12-07
      相关资源
      最近更新 更多