質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

0回答

605閲覧

Spring Data RESTを利用する場合のPUT、PATCHメソッドの非公開方法

flaumig

総合スコア67

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

1グッド

1クリップ

投稿2019/11/01 05:04

編集2019/11/05 04:46

やりたいこと

Spring Data REST + MongoDBで作成したAPIのうち、PUTとPATCHメソッドのみを非公開としたい。

試したこと

Spring Data RESTを利用してAPIを作成しようと思い、下記のようなコードを書いてみました。

作成したコード

Java

1@SpringBootApplication 2public class SampleApplication { 3 4 public static void main(String[] args) { 5 SpringApplication.run(SampleApplication.class, args); 6 } 7}

Java

1@Data 2public class User { 3 4 @Id 5 private int userId; 6 7 private String firstName; 8 9 private String familyName; 10}

Java

1@RepositoryRestResource(collectionResourceRel = "user") 2public interface SampleRepository extends MongoRepository<User, String> { 3}

実行結果1

http://localhost:8080/profile/users にアクセスして、CRUDに対応するAPIが出来ていることを確認しました。

{
"alps": {
"version": "1.0",
"descriptor": [
{
"id": "user-representation",
"href": "http://localhost:8080/profile/users",
"descriptor": [
{
"name": "firstName",
"type": "SEMANTIC"
},
{
"name": "familyName",
"type": "SEMANTIC"
}
]
},
{
"id": "create-user",
"name": "user",
"type": "UNSAFE",
"rt": "#user-representation"
},
{
"id": "get-user",
"name": "user",
"type": "SAFE",
"descriptor": [
{
"name": "page",
"type": "SEMANTIC",
"doc": {
"format": "TEXT",
"value": "The page to return."
}
},
{
"name": "size",
"type": "SEMANTIC",
"doc": {
"format": "TEXT",
"value": "The size of the page to return."
}
},
{
"name": "sort",
"type": "SEMANTIC",
"doc": {
"format": "TEXT",
"value": "The sorting criteria to use to calculate the content of the page."
}
}
],
"rt": "#user-representation"
},
{
"id": "get-user",
"name": "user",
"type": "SAFE",
"rt": "#user-representation"
},
{
"id": "patch-user",
"name": "user",
"type": "UNSAFE",
"rt": "#user-representation"
},
{
"id": "delete-user",
"name": "user",
"type": "IDEMPOTENT",
"rt": "#user-representation"
},
{
"id": "update-user",
"name": "user",
"type": "IDEMPOTENT",
"rt": "#user-representation"
}
]
}
}

試したこと2

次に、更新系のAPIを非公開にしてみたいと思い
下記のようにコードを修正しました。

修正したリポジトリクラス

下記ページを参照したところ、
非公開にしたいメソッドをオーバーライドして
@RestResource(exported = false)を付けると
そのメソッドは非公開になるとの記述があったので
org.springframework.data.repository.CrudRepositoryのsaveメソッドをオーバーライドした後に
@RestResource(exported = false)を付けて実行してみました。

■参考サイト
http://pppurple.hatenablog.com/entry/2017/03/06/221334

Java

1@RepositoryRestResource(collectionResourceRel = "user") 2public interface SampleRepository extends MongoRepository<User, String> { 3 4 @Override 5 @RestResource(exported = false) 6 public User save(User user); 7 8}

実行結果2

http://localhost:8080/profile/users にアクセスすると、
データを登録&更新するAPI(POST,PUT,PATCH)が全て非公開になっていました。

{
"alps": {
"version": "1.0",
"descriptor": [
{
"id": "user-representation",
"href": "http://localhost:8080/profile/users",
"descriptor": [
{
"name": "firstName",
"type": "SEMANTIC"
},
{
"name": "familyName",
"type": "SEMANTIC"
}
]
},
{
"id": "get-user",
"name": "user",
"type": "SAFE",
"descriptor": [
{
"name": "page",
"type": "SEMANTIC",
"doc": {
"format": "TEXT",
"value": "The page to return."
}
},
{
"name": "size",
"type": "SEMANTIC",
"doc": {
"format": "TEXT",
"value": "The size of the page to return."
}
},
{
"name": "sort",
"type": "SEMANTIC",
"doc": {
"format": "TEXT",
"value": "The sorting criteria to use to calculate the content of the page."
}
}
],
"rt": "#user-representation"
},
{
"id": "delete-user",
"name": "user",
"type": "IDEMPOTENT",
"rt": "#user-representation"
},
{
"id": "get-user",
"name": "user",
"type": "SAFE",
"rt": "#user-representation"
}
]
}
}

ちなみに、
org.springframework.data.repository.CrudRepositoryの
deleteメソッドに@RestResource(exported = false)を付けた場合は
DELETEメソッドが非公開になることが確認できましたが、

org.springframework.data.mongodb.repository.MongoRepositoryの
insertメソッドに@RestResource(exported = false)を付けた場合は
実行結果1と同じく全てのメソッドが公開されることを確認しております。

継承している親クラスを辿って確認しましたが、
1レコード分のデータ登録、更新系のメソッドは、下記以外に見つけられませんでした。
org.springframework.data.repository.CrudRepository#save
org.springframework.data.mongodb.repository.MongoRepository#insert

MongoRepositoryを継承したリポジトリクラスの場合、

  • POSTは公開
  • PUT、PATCHは非公開

といった制御は出来ないのでしょうか?

対応方法をもしご存じの方がいらっしゃいましたら
ご教示いただけますと幸いです。

開発環境

Java8
Spring Boot 2.1.8
MongoDB 4.0
Lombok

A-pZ👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問