私はAPIを作成するのが初めてで、いくつかの調査を行い、依存性注入を使用してそれを実行するために必要なことを達成するために気づきました。私は2つのデータソースを持つAndroidアプリケーションを書いています。1つはWebサービスによって公開され、もう1つはSQLliteです。SQLliteは、データ接続が利用できない場合のバックアップとして使用されます(当面は、APIのWebサービス部分にのみ関心があります)。必要なモデルに基づいて適切なデータアクセスクラスを呼び出す、これに抽象化レイヤーを提供するAPIを作成したいと思います。したがって、IDataAccessと呼ばれるAPIが実装する必要のあるメソッドを記述するインターフェイスがあります(何をすべきかを理解する目的でgetAllにのみ関心があります)。
public interface IDataAccess {
public <T> List <T> getAll ();
public <T> T getById (int id);
}//end IDataAccess
依存性注入にGuiceを使用しています。guiceモジュールは次のとおりです。
public class Data extends AbstractModule {
public void configure () {
bind (IDataAccess.class).to(UserData.class);
}
}
IDataAccessの実装は次のとおりです(Jersey Client APIを使用していることに注意してください)。
public class UserData extends DataAccessManager implements IDataAccess {
@SuppressWarnings("unchecked")
public List <User> getAll () {
WebResource webResource = client.resource (WebResourceURL.URL_USER_ALL);
ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
if (response.getStatus () == 200)
return response.getEntity(new GenericType <List <User>> () {}) ;
else
return null;
}//end getAllUsers method
}
必要なリソースをロードしてインスタンス化するクラスがあります。また、DataAccessFactoryと呼ばれるDataManagerのインスタンスを返します。
public class DataAccessFactory {
private Client client;
private static DataAccessFactory instance;
private DataAccessFactory() {
client = Client.create();
}
public static DataAccessFactory getInstance() {
/*
* check if instance variable is instantiated.
* if it is not then instantiated it and returns
* created instance.
*/
if (instance == null) {
instance = new DataAccessFactory();
return instance;
} else
return instance;
}//end getInstance method
public DataAccessManager createDataAccessManager() {
return new DataAccessManager(client);
}//end createDataAccessManager method
}
次に、実際のDataAccessManagerクラスがあります。
public class DataAccessManager {
protected Client client;
protected DataAccessManager (Client client)n{
this.client = client;
}//end constructor
public <T> List <Object> getAll(T t) {
Data module = new Data ();
Injector injector = Guice.createInjector(module);
IDataAccess data = (IDataAccess) injector.getInstance(t.getClass());
return (List<Object>) data;
}//end fetchAllUser method
}
このクラスのユーザーモデルを呼び出すには、次のようにします。
@Test
public void fetchUser () {
DataAccessManager m = DataAccessFactory.getInstance().createDataAccessManager();
List<User> user = (List<User>) m.getAll(new Userdata ());
if (user == null)
assertEquals(1, 2);
else
assertEquals(1, 1);
}
理想的には、これを今実行したいのは、UserDataを呼び出してすべてのUserオブジェクトを取得するか、OrderData(実装が記述されている場合)クラスを呼び出してすべての注文オブジェクトなどを取得することです。
問題は、これがエラーを引き起こしていることです。
リストからリストにキャストできません
どうすればこの問題を修正したり、意味のあるように再構築したりできますか?