Spring Boot と Jersey を使用した Reveal SDK サーバーのセットアップ
手順 1 - Jersey プロジェクトで Spring Boot を作成する
以下の手順では、Jersey プロジェクトを使用して新しい Java Spring Boot を作成する方法について説明します。既存のアプリケーションに Reveal SDK を追加する場合は、手順 2 へ移動します。
Visual Studio Code で Spring Boot アプリケーションを開発するには、以下をインストールする必要があります:
Visual Studio Code と Java の使用を開始する方法の詳細については、Java の使用を開始するチュートリアルを参照してください。
1 - Visual Studio Code を起動し、コマンド パレットを開いて >Spring Initializr: Create a Maven Project と入力し、Enter を押します。
2 - Spring Boot バージョン 3.3.2 を選択します。
バージョン 2.x は Reveal 1.7.x 以降、サポートされていません。
3 - 言語として Java を選択します。
4 - グループ ID を提供します。この例では、com.server を使用しています。
5 - 成果物 ID を提供します。この例では、reveal を使用しています。
6 - War パッケージ タイプを選択します。
7 - Java のバージョンを選択します。Spring Boot 3.x を使用する場合、17 以降が必要です。
8 - Spring Web と Jersey の依存関係を選択します。
9 - 新しく作成したプロジェクトを保存して開きます。
手順 2 - Reveal SDK の追加
1 - pom.xml ファイルを更新します。
まず、Reveal Maven リポジトリを追加します。
<repositories>
<repository>
<id>reveal.public</id>
<url>https://maven.revealbi.io/repository/public</url>
</repository>
</repositories>
次に、Reveal SDK を依存関係として追加します。
<dependency>
<groupId>com.infragistics.reveal.sdk</groupId>
<artifactId>reveal-sdk</artifactId>
<version>1.7.1</version>
</dependency>
2 - Jersey Config クラスを作成し、RevealEngineInitializer.initialize
メソッドを呼び出して Reveal SDK を初期化します。Reveal SDK が Jersey で適切に機能するには、すべての Reveal SDK クラスを Jersey に登録する必要があります。Reveal SDK クラスを登録するには、RevealEngineInitializer.getClassesToRegister
メソッドによって返されたクラスをループして、Jersey Config に登録します。
import org.glassfish.jersey.server.ResourceConfig;
import org.springframework.stereotype.Component;
import com.infragistics.reveal.engine.init.InitializeParameterBuilder;
import com.infragistics.reveal.engine.init.RevealEngineInitializer;
import javax.ws.rs.ApplicationPath;
@Component
@ApplicationPath("/")
public class RevealJerseyConfig extends ResourceConfig
{
public RevealJerseyConfig()
{
RevealEngineInitializer.initialize();
//register all Reveal classes in JAX-RS context
for (Class<?> clazz : RevealEngineInitializer.getClassesToRegister()) {
register(clazz);
}
}
}
手順 3 - ダッシュボード プロバイダーの作成
1 - Visual Studio Code で resources フォルダーを選択し、エクスプローラーで [新しいフォルダー] ボタンをクリックします。新しいフォルダーに dashboards という名前を付けます。
2 - 次に、新しく作成された dashboards フォルダーから Reveal ダッシュボードを読み込むダッシュボード プロバイダーを作成します。
import com.infragistics.reveal.sdk.api.IRVUserContext;
import java.io.IOException;
import java.io.InputStream;
import com.infragistics.reveal.sdk.api.IRVDashboardProvider;
public class RevealDashboardProvider implements IRVDashboardProvider {
@Override
public InputStream getDashboard(IRVUserContext userContext, String dashboardId) throws IOException {
InputStream dashboardStream = getClass().getResourceAsStream("/dashboards/" + dashboardId + ".rdash");
return dashboardStream;
}
@Override
public void saveDashboard(IRVUserContext arg0, String arg1, InputStream arg2) throws IOException {
}
}
3 - 最後に、RevealJerseyConfig
クラスの RevealEngineInitializer
を使用してダッシュボード プロバイダーを登録します。
@Component
@ApplicationPath("/")
public class RevealJerseyConfig extends ResourceConfig
{
public RevealJerseyConfig()
{
RevealEngineInitializer.initialize(new InitializeParameterBuilder()
.setDashboardProvider(new RevealDashboardProvider())
.build());
//register all Reveal classes in JAX-RS context
for (Class<?> clazz : RevealEngineInitializer.getClassesToRegister()) {
register(clazz);
}
}
}
手順 4 - CORs ポリシー (デバッグ) の設定
アプリケーションの開発とデバッグでは、サーバーとクライアント アプリを異なる URL でホストするのが一般的です。例えば、サーバーは https://localhost:24519
で実行されている可能性がありますが、Angular アプリは https://localhost:4200
で実行されている可能性があります。クライアント アプリケーションからダッシュボードを読み込もうとすると、Cross-Origin Resource Sharing (CORS) ポリシーが原因で失敗します。このシナリオを有効にするには、CORS ポリシーを作成し、サーバー プロジェクトで有効にする必要があります。
1 - CorsFilter を作成します。
import java.io.IOException;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ContainerRequestFilter;
import jakarta.ws.rs.container.ContainerResponseContext;
import jakarta.ws.rs.container.ContainerResponseFilter;
import jakarta.ws.rs.container.PreMatching;
import jakarta.ws.rs.core.Response;
@PreMatching
public class CorsFilter implements ContainerRequestFilter, ContainerResponseFilter {
/**
* Method for ContainerRequestFilter.
*/
@Override
public void filter(ContainerRequestContext request) throws IOException {
// If it's a preflight request, we abort the request with
// a 200 status, and the CORS headers are added in the
// response filter method below.
if (isPreflightRequest(request)) {
request.abortWith(Response.ok().build());
return;
}
}
/**
* A preflight request is an OPTIONS request
* with an Origin header.
*/
private static boolean isPreflightRequest(ContainerRequestContext request) {
return request.getHeaderString("Origin") != null
&& request.getMethod().equalsIgnoreCase("OPTIONS");
}
/**
* Method for ContainerResponseFilter.
*/
@Override
public void filter(ContainerRequestContext request, ContainerResponseContext response)
throws IOException {
// if there is no Origin header, then it is not a
// cross origin request. We don't do anything.
if (request.getHeaderString("Origin") == null) {
return;
}
// If it is a preflight request, then we add all
// the CORS headers here.
if (isPreflightRequest(request)) {
response.getHeaders().add("Access-Control-Allow-Credentials", "true");
response.getHeaders().add("Access-Control-Allow-Methods",
"GET, POST, PUT, DELETE, OPTIONS, HEAD");
response.getHeaders().add("Access-Control-Allow-Headers",
// Whatever other non-standard/safe headers (see list above)
// you want the client to be able to send to the server,
// put it in this list. And remove the ones you don't want.
"X-Requested-With, Authorization, " +
"Accept-Version, Content-MD5, CSRF-Token, Content-Type");
}
// Cross origin requests can be either simple requests
// or preflight request. We need to add this header
// to both type of requests. Only preflight requests
// need the previously added headers.
response.getHeaders().add("Access-Control-Allow-Origin", "*");
}
}
2 - RevealJerseyConfig
クラスに CorsFilter
を登録します。
@Component
@ApplicationPath("/")
public class RevealJerseyConfig extends ResourceConfig
{
public RevealJerseyConfig()
{
RevealEngineInitializer.initialize(new InitializeParameterBuilder()
.setDashboardProvider(new RevealDashboardProvider())
.build());
//register all Reveal classes in JAX-RS context
for (Class<?> clazz : RevealEngineInitializer.getClassesToRegister()) {
register(clazz);
}
//register the cors filter for debugging
register(CorsFilter.class);
}
}
このサンプルのソース コードは GitHub にあります。