私は次のインターフェースを持っています:
public interface Mapper {
public SomeType methodOne(HashMap<String, Object>);
public OtherType methodTwo(HashMap<String, Object>);
...
}
methodOne
次に、またはmethodTwo
別のクラス内のパラメーターとして呼び出すことは可能ですか?
public class Other {
public void doSomething(HashMap<String, Object> params, ????) {
Mapper mapper = new ConcreteMapper();
mapper.methodOne(params);
}
}
Java リフレクションを試しましたがHashMap<String, Object>
、コンパイル時に の型を取得できませんでした。この問題を回避する方法はありますか?
動機は、私が職場で遭遇した実際の問題から来ています。たとえば、各REST
メソッド呼び出しで異なるのはgetAddressPhone
とだけですAddressPhoneType
。SQL セッションを開く、インスタンス化するなどのノイズの多い手順Mapper
は、基本的に同じです。
public Response getAddressPhone(@PathParam("acc_nbr") String accNbr, @HeaderParam("AuthToken") String authToken) {
SqlSession session = ConnectionFactory.getSqlSessionFactory().openSession();
Logger log = LoggerFactory.getLoggerFactory();
AddressPhoneType addressPhone = null;
try {
MyAccountMapper mapper = session.getMapper(MyAccountMapper.class);
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("acc_nbr", accNbr);
addressPhone = mapper.getAddressPhone(map);
if (addressPhone == null) {
return Response.ok(null).status(Status.NOT_FOUND).build();
}
} catch (Exception e) {
log.debug("getAddressPhone(map):" + e.getMessage());
return Response.ok().status(Status.BAD_REQUEST).build();
} finally {
session.close();
}
return Response.ok(gson.toJson(addressPhone)).header("AuthToken", authToken).status(Status.OK).build();
}
EDIT MyBatisマッパーを
使用して MySql クエリを実行しているため、次のインターフェイスが呼び出されMyAccountMapper
ます。これらのメソッドはそれぞれ SQL クエリの id でマッピングされるため、定義はありません。
public interface MyAccountMapper {
AddressPhoneType getAddressPhone(HashMap<String, Object> map);
AdminUserInfoType getAdminUserInfo(HashMap<String, Object> map);
DueDateInfoType getDueDateInfo(HashMap<String, Object> map);
....
}
今、すべての Web サービス呼び出し (私は JAX-RS を使用しています) で、これらのメソッドを呼び出してデータベースで何かを行う必要があります。上記の例からわかるように、マッパーのセットアップ、ロガーの作成などのほとんどのもの同じだ。唯一の違いは、メソッド呼び出しと戻り値の型です。
@GET
@Path("/admin/user/info/{acc_nbr}")
@Produces("application/json")
public Response getAdminUserInfo(@PathParam("acc_nbr") String accNbr) {
SqlSession session = ConnectionFactory.getSqlSessionFactory().openSession();
AdminUserInfoType adminUserInfoType = null;
Logger log = LoggerFactory.getLoggerFactory();
try {
MyAccountMapper mapper = session.getMapper(MyAccountMapper.class);
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("acc_nbr", accNbr);
adminUserInfoType = mapper.getAdminUserInfo(map);
if (adminUserInfoType == null) {
return Response.ok(gson.toJson(null)).status(Status.NOT_FOUND).build();
}
} catch (Exception e) {
log.debug("getAdminUserInfo(map):" + e.getMessage());
return Response.ok("getAdminUserInfo(map):"+ MyBatisErrorMessage.SELECT_ERROR).status(Status.BAD_REQUEST).build();
} finally {
session.close();
}
return Response.ok(gson.toJson(adminUserInfoType)).status(Status.OK).build();
}
@GET
@Path(value = "/address/phone/{acc_nbr}")
@Produces(MediaType.APPLICATION_JSON)
public Response getAddressPhone(@PathParam("acc_nbr") String accNbr,
@HeaderParam("AuthToken") String authToken) {
SqlSession session = ConnectionFactory.getSqlSessionFactory().openSession();
Logger log = LoggerFactory.getLoggerFactory();
AddressPhoneType addressPhone = null;
try {
MyAccountMapper mapper = session.getMapper(MyAccountMapper.class);
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("acc_nbr", accNbr);
addressPhone = mapper.getAddressPhone(map);
if (addressPhone == null) {
return Response.ok(null).status(Status.NOT_FOUND).build();
}
} catch (Exception e) {
log.debug("getAddressPhone(map):" + e.getMessage());
return Response.ok("getAddressPhone(map):"+ MyBatisErrorMessage.SELECT_ERROR).status(Status.BAD_REQUEST).build();
} finally {
session.close();
}
return Response.ok(gson.toJson(addressPhone)).header("AuthToken", authToken).status(Status.OK).build();
}