APIプロジェクトのアーキテクチャに必要なオプションを見つけようとしています。JAX-RS API、ServiceLocator、リモートEJBを使ってプロジェクトを整理するオプション
JAX-RSバージョン1.0を使用してAPIを作成したいと考えています。このAPIは、より大きく、複雑で複雑なアプリケーションからリモートEJB(EJB 3.0)を使用します。私はJava 6を使用しています。
これまでのところ、私はこれを行うことができ、動作します。しかし、私は解決策に満足していません。私のパッケージの処分を参照してください。 com.organization.api.v1.services.UserV1Service
の
@Path("/v1/user/")
public class UserV1RS {
@GET
public UserV1VO getUsername() {
UserV1VO userVO = ServiceLocator.get(UserV1Service.class).getUsername();
return userVO;
}
}
例:com.organization.api.v1.rs.UserV1RS
の
/api/
/com.organization.api.v1.rs -> Rest Services with the JAX-RS annotations
/com.organization.api.v1.services -> Service classes used by Rest Services. Basically, they only have the logic to transform the DTOs objects from Remote EJBs in JSON. This is separated by API version, because the JSON can be different in each version.
/com.organization.api.v1.vo -> View Objects returned by the Rest Services. They will be transformed in JSON using Gson.
/com.organization.api.services -> Service classes used by versioned Services.
Here we have the lookup for Remote EJBs and some API logic, like validations. This services can be used by any versioned of each Service.
例:com.organization.api.services.UserService
の
public class UserV1Service extends UserService {
public UserV1VO getUsername() {
UserDTO userDTO = getUserName(); // method from UserService
return new UserV1VO(userDTO.getName);
}
}
例:
public class UserService {
public UserDTO getUsername() {
UserDTO userDTO = RemoteEJBLocator.lookup(UserRemote.JNDI_REMOTE_NAME).getUser();
return userDTO;
}
}
私の懸念は、コードの後に記述されています私のプロジェクトのの
いくつかの要件:UserService
を使用してUserV1Service
とUserV2Service
:同じバージョン管理サービスの異なるAPIのバージョンがコードを共有することができV1、V2など
- APIはバージョンがあります。
- 異なるバージョンのサービスの異なるAPIバージョンでは、
UserV1Service
とOrderV2Service
のコードを共有できます(AnotherService
を使用)。 - 各バージョンには独自のビューオブジェクト(
UserV1VO
で、UserVO
ではない)があります。- この
ServiceLocator
クラスそれはない私のために良い方法:上記のコードについて教えてbotters何
- この
。このクラスは古いライブラリのレガシーコードを使用しています。このクラスの仕組みについて多くの質問があります。 ServiceLocator
を使用する方法は私にとっても非常に奇妙で、この戦略はnot good to mock the servicesfor my unit testsです。私は新しいServiceLocatorを作成したり、依存関係注入戦略(または別のより良いアプローチ)を使用したいと思います。
OrderService
のような別の「外部」サービスでは、UserService
クラスを使用することはできません。 UserVxService
の場合のみです。しかし、将来的には、多分OrderService
は、私は、私は自分のコードの中lookups
の多くを行う必要がありますServiceLocator
を使用して、最後の問題を無視した場合でもUserService
...com.organization.api.services
)では、UserV1VO
のようなVOを使用できますが、これは起こりません。良いアーキテクチャーは許可されていないものを許可しません。私はapi-services
のような新しいプロジェクトを作成し、これを避けるためにそこにcom.organization.api.services
を入れる考えがあります。これは良い解決策ですか?だから...アイデア?
こんにちは!答えをありがとう。悲しいことに、私のServiceLocatorは静的メソッドを呼び出します。私はこのメソッド(http://stackoverflow.com/questions/512877/why-cant-i-define-a-static-method-in-a-java-interface)のインターフェースを作成することはできません。 java 6. – Dherik
@DherikあなたはおそらくJava 6に関する質問を編集したいと思っています... –
完了!私はこの情報を含む私の質問を編集しました@ Shiraaz.M – Dherik