Spring MVCのインタビューの質問
1.はじめに
Spring MVCは、Servlet API上に構築されたSpringのオリジナルのWebフレームワークです。柔軟なWebアプリケーションの開発に使用できるModel-View-Controllerアーキテクチャを提供します。
このチュートリアルでは、Spring開発者の就職の面接に関するトピックであることが多いので、それに関連する質問に焦点を当てます。
Spring Frameworkに関するその他の質問については、私たちのhttps://www.baeldung.com/tag/interview/[
その他のSpring関連記事
]をチェックしてください。インタビュー質問シリーズ]。
2.基本的なSpring MVCの質問
==== Q1。なぜSpring MVCを使うべきなのか
-
Spring MVCは、私たちが自分のアプリケーションを簡単に開発しユニットテストすることを可能にする懸念の明確な分離を実装しています。
のような概念:
-
ディスパッチャサーブレット
-
コントローラ
-
リゾルバーを見る
-
ビュー、モデル
-
ModelAndView
-
モデルとセッションの属性
互いに完全に独立しており、それらは1つのことだけに責任があります。
したがって、
MVCは私たちに非常に大きな柔軟性
を与えます。これは(提供された実装クラスを持つ)インターフェースに基づいており、カスタムインターフェースを使用してフレームワークのあらゆる部分を設定できます。
-
もう1つ重要なことは、特定のビューテクノロジ(JSPなど)に縛られていないことですが、最も気に入っているものから選択することもできます** 。
また、私たちはSpring MVCをWebアプリケーション開発だけでなく、RESTful Webサービスの作成にも使用しません。
Q2.
@ Autowired
アノテーションの役割は何ですか?
-
@ Autowired
アノテーションは、タイプ別にBeanをインジェクトするためのフィールドまたはメソッドで使用できます。このアノテーションは、SpringがコラボレーションBeanを解決してあなたのBeanに注入することを可能にします。
詳しくは、https://www.baeldung.com/spring-autowire[
@Autowired
in Spring]に関するチュートリアルを参照してください。
==== Q3。モデル属性を説明する
@ ModelAttribute
アノテーションは、Spring MVCで最も重要なアノテーションの1つです。
メソッドパラメータまたはメソッドの戻り値を名前付きモデル属性にバインドしてからWebビューに公開します
。
メソッドレベルで使用する場合は、そのメソッドの目的は1つ以上のモデル属性を追加することです。
一方、メソッドの引数として使用した場合は、引数をモデルから取得する必要があることを示します。存在しない場合は、最初にインスタンス化してからモデルに追加する必要があります。モデルに入ったら、名前が一致するすべてのリクエストパラメータからargumentsフィールドに値を入力します。
このアノテーションの詳細については、https://www.baeldung.com/spring-mvc-and-themodelattribute-annotation[
@ ModelAttribute
アノテーションに関連する記事]をご覧ください。
==== Q4。
@ Controller
と
@ RestController
の違いを説明してください。
@ Controller
アノテーションと
@ RestController
アノテーションの主な違いは、
@ ResponseBody
アノテーションは自動的に
@ RestController
** に含まれることです。つまり、ハンドラメソッドに
@ ResponseBody
というアノテーションを付ける必要はありません。 HTTPレスポンスボディにレスポンスタイプを直接書きたい場合は、これを
@ Controller
クラスで行う必要があります。
==== Q5。
PathVariable
を記述する
-
URIテンプレート変数** の値を抽出するために
@ PathVariable
アノテーションをハンドラメソッドのパラメータとして使用できます。
たとえば、
www.mysite.com/user/123
からIDでユーザーを取得する場合は、コントローラ内のメソッドを
/user/\ {id}
としてマッピングする必要があります。
@RequestMapping("/user/{id}")
public String handleRequest(@PathVariable("id") String userId, Model map) {}
-
@ PathVariable
には、
value
という名前の要素が1つだけあります。これはオプションです。URIテンプレート変数名** を定義するために使用します。 value要素を省略した場合、URIテンプレートの変数名はメソッドのパラメータ名と一致する必要があります。
次々に宣言することで、複数の
@ PathVariable
注釈を付けることもできます。
@RequestMapping("/user/{userId}/name/{userName}")
public String handleRequest(@PathVariable String userId,
@PathVariable String userName, Model map) {}
または、それらすべてを
Map <String、String>
または
MultiValueMap <String、String>
に入れます。
@RequestMapping("/user/{userId}/name/{userName}")
public String handleRequest(@PathVariable Map<String, String> varsMap, Model map) {}
==== Q6。 Spring MVCを使った検証
-
Spring MVCはデフォルトでJSR-303仕様をサポートしています。 Spring MVCアプリケーション** にJSR-303とその実装依存関係を追加する必要があります。たとえば、Hibernate Validatorは、私たちが自由に使用できるJSR-303実装の1つです。
JSR-303は、@ @ NotNull
、
@ Min
、
@ Max__などのアノテーションを使用して、Beanのプロパティが特定の基準を満たすことを保証する、Beanの検証用のJava API、JavaEEおよびJavaSEの一部です。検証の詳細については、https://www.baeldung.com/javax-validation[Java Bean Validation Basics]の記事を参照してください。
-
Springは
@ Validator
アノテーションと
BindingResult
クラスを提供しています** 。無効なデータがある場合、
Validator
実装はコントローラリクエストハンドラメソッドでエラーを発生させます。それから、
BindingResult
クラスを使用してこれらのエラーを取得します。
既存の実装を使用する以外にも、独自のものを作成できます。そのために、まずJSR-303仕様に準拠した注釈を作成します。それから、
Validator
クラスを実装します。もう1つの方法は、Springの
Validator
インターフェースを実装し、それをバリデータとして設定することです
Controller
クラスの
@ InitBinder
アノテーション。
独自の検証を実装して使用する方法を確認するには、https://www.baeldung.com/spring-mvc-custom-validator[Spring MVCでのカスタム検証]に関するチュートリアルを参照してください。
==== Q7。
@ RequestBody
と
@ ResponseBody
は何ですか?
-
ハンドラメソッドパラメータとして使用される
@ RequestBody
アノテーションは、HTTPリクエストボディを転送オブジェクトまたはドメインオブジェクトにバインドします。 Springは、HTTPメッセージコンバータを使用して、着信HTTP要求をJavaオブジェクトに自動的に逆シリアル化します。 -
Spring MVCコントローラのハンドラメソッドに
@ ResponseBody
アノテーションを使用すると、そのメソッドの戻り値の型を直接HTTPレスポンスボディ** に書き込むことになります。それを
Model
に入れないでください、そして、Springはビュー名として解釈されません。
これらのアノテーションの詳細については、https://www.baeldung.com/spring-request-response-body[
@RequestBody
and
@ ResponseBody
]の記事をご覧ください。
==== Q8。
Model
、
ModelMap
、および
ModelAndView
を説明しますか。
-
Model
インターフェースはモデル属性
のためのホルダーを定義します。
ModelMap
は同様の目的を持っています、値の集まりを渡すことができます** 。その後、それらの値を
Map
内にあるかのように扱います。
Model
(
ModelMap
)にはデータしか格納できないことに注意してください。データを入れてビュー名を返します。
一方、
ModelAndView
を使用すると、オブジェクト自体が返されます
。データやビュー名など、必要な情報をすべて返すオブジェクトに設定します。
あなたはhttps://www.baeldung.com/spring-mvc-model-model-map-model-view[
Model、ModelMap
、および
ModelView
]の記事で詳細を見つけることができます。
==== Q9。
SessionAttributes
と
SessionAttribute
について説明する
-
@ SessionAttributes
アノテーションはユーザーのセッションにモデル属性を格納するために使用されます。 -attributes[Spring MVCのセッション属性]:
@Controller
@RequestMapping("/sessionattributes")
@SessionAttributes("todos")
public class TodoControllerWithSessionAttributes {
@GetMapping("/form")
public String showForm(Model model,
@ModelAttribute("todos") TodoList todos) {
//method body
return "sessionattributesform";
}
//other methods
}
前の例では、
@ ModelAttribute
と
@ SessionAttributes
が同じ名前属性を持つ場合、モデル属性 ‘
todos
‘がセッションに追加されます。
-
グローバルに管理されるセッションから既存の属性を取得したい場合は、メソッドパラメータとして
@ SessionAttribute
アノテーションを使用します。
@GetMapping
public String getTodos(@SessionAttribute("todos") TodoList todos) {
//method body
return "todoView";
}
==== Q10。
@ EnableWebMVC
の目的は何ですか?
-
@ EnableWebMvc
アノテーションの目的は、Java設定を介してSpring MVCを有効にすることです。これはXML構成の
<mvc:annotation-driven>
と同じです。このアノテーションは、
WebMvcConfigurationSupport
からSpring MVC設定をインポートします。これは、
@ RequestMapping
を使用して着信要求をハンドラーメソッドにマッピングする
@ Controller
アノテーション付きクラスのサポートを有効にします。
あなたは私たちのhttps://www.baeldung.com/spring-enable-annotations[Springへのガイド
@ Enable
Annotations]でこれと同様のアノテーションについてより多くを学ぶことができます。
Q11. Springの
ViewResolver
とは何ですか?
-
ViewResolver
は、アプリケーションがブラウザでモデルをレンダリングすることを可能にします – 実装を特定のビューテクノロジに結び付けることなく
ビュー名を実際のビューにマッピングすることによって
。
ViewResolver
の詳細については、https://www.baeldung.com/spring-mvc-view-resolver-tutorial[Spring MVCのViewResolverの手引き]をご覧ください。
==== Q12。
BindingResult
とは何ですか?
-
BindingResult
は、バインディング結果を表す
org.springframework.validation
パッケージのインタフェースです。これを使って、送信されたフォーム** でエラーを検出し報告することができます。呼び出すのは簡単です。検証するフォームオブジェクトの直後にパラメータとして設定する必要があります。
カスタムバリデータチュートリアル
で見られるように、オプションの
Model
パラメータは
BindingResult
の後に来るべきです:
@PostMapping("/user")
public String submitForm(@Valid NewUserForm newUserForm,
BindingResult result, Model model) {
if (result.hasErrors()) {
return "userHome";
}
model.addAttribute("message", "Valid form");
return "userHome";
}
-
Springが
@ Valid
アノテーションを見つけると、まず検証されるオブジェクトのバリデータを見つけようとします** それから検証アノテーションを取得してバリデータを呼び出します最後に、検出されたエラーを
BindingResult
に入れて、後者をビューモデルに追加します。
==== Q13。フォームバッキングオブジェクトとは何ですか?
-
フォームバッキングオブジェクトまたはコマンドオブジェクトは、送信するフォームからデータを収集する単なるPOJOです** 。
データだけでロジックは含まれていません。
Spring MVCのフォームでフォームバッキングオブジェクトを使用する方法については、https://www.baeldung.com/spring-mvc-form-tutorial[Spring MVCのフォーム]に関する記事をご覧ください。
==== * Q14。 __ @修飾子アノテーションの役割は何ですか?**
-
これは
@ Autowired
アノテーションと同時に使用され、Bean型の複数のインスタンスが存在するときの混乱を避けるために** です。
例を見てみましょう。 XML設定で2つの類似のBeanを宣言しました。
<bean id="person1" class="com.baeldung.Person" >
<property name="name" value="Joe"/>
</bean>
<bean id="person2" class="com.baeldung.Person" >
<property name="name" value="Doe"/>
</bean>
Beanを配線しようとすると、
org.springframework.beans.factory.NoSuchBeanDefinitionException.
が返されます。修正するには、
@ Qualifier
を使用して、どのBeanを配線する必要があるかを通知する必要があります。
@Autowired
@Qualifier("person1")
private Person person;
Q15.
@必須
注釈の役割は何ですか?
-
@ Required
アノテーションは設定メソッドで使用されており、このアノテーションを持つBeanプロパティは設定時に設定されなければならないことを示します。それ以外の場合、Springコンテナは
BeanInitializationException
例外をスローします。
また、
@必須
は
@ Autowired
とは異なります – セッターに限定されているのに対し、
@ Autowired
はそうではありません。
@ Autowired
は、コンストラクタとフィールドとの通信にも使用できますが、
@ Required
は、プロパティが設定されているかどうかのみを確認します。
例を見てみましょう。
public class Person {
private String name;
@Required
public void setName(String name) {
this.name = name;
}
}
さて、
Person
Beanの
name
は次のようにXML設定で設定する必要があります。
<bean id="person" class="com.baeldung.Person">
<property name="name" value="Joe"/>
</bean>
-
@ Required
はデフォルトではJavaベースの
@ Configuration
クラスでは動作しません** 。すべてのプロパティが設定されていることを確認する必要がある場合は、
@ Bean
アノテーション付きメソッドでBeanを作成するときに設定できます。
==== Q16。フロントコントローラーのパターンを説明する
-
フロントコントローラパターンでは、すべての要求は最初にサーブレット
ではなくフロントコントローラに送られます。
返事の準備ができていることを確認し、それをブラウザに送り返します。このようにして、外の世界から来るものすべてをコントロールする場所が1つあります。
フロントコントローラは最初にリクエストを処理すべきサーブレットを識別します。次に、サーブレットからデータを取得したら、どのビューをレンダリングするかを決定し、最後に、レンダリングしたビューを応答として返します。
https://www.baeldung.com/uploads/front
end
controller-100×40.png%20100w[]
実装の詳細を確認するには、https://www.baeldung.com/java-front-controller-pattern[Javaのフロントコントローラパターンの手引き]を参照してください。
Q17. モデル1とモデル2のアーキテクチャとは何ですか?
モデル1とモデル2は、Java Webアプリケーションを設計する際によく使用される2つの設計モデルを表します。
モデル1では、リクエストはサーブレットまたはJSPに送られ、そこで処理されます。
サーブレットまたはJSPは要求を処理し、ビジネスロジックを処理し、データを取得して検証し、応答を生成します。
このアーキテクチャは実装が簡単なので、通常は小さくてシンプルなアプリケーションで使用します。
一方、大規模なWebアプリケーションには便利ではありません。
機能は、ビジネスロジックとプレゼンテーションロジックが結合されているJSP内で重複することがよくあります。
Model 2はModel View Controllerデザインパターンに基づいており、コンテンツを操作するロジックからビューを分離します。
-
さらに、MVCパターンでは、モデル、ビュー、およびコントローラーの3つのモジュールを区別できます。モデルはアプリケーションの動的データ構造を表しています。データとビジネスロジックの操作を担当します。ビューはデータの表示を担当し、コントローラーは前の2つの間のインターフェースとして機能します。
モデル2では、要求がコントローラーに渡され、コントローラーは表示されるべき正しいコンテンツを取得するために必要なロジックを処理します。次にコントローラは、通常JavaBeanまたはPOJOとして、コンテンツをリクエストに戻します。また、どのビューがコンテンツをレンダリングするかを決定し、最後にリクエストをそれに渡します。次に、ビューはデータをレンダリングします。
3. Advanced Spring MVCに関する質問
==== * Q18。
@ Controller
、
@ Component
、
@ Repository、および
@ Service__アノテーションの違いは何ですか?
Springの公式文書によると、
@ Component
は、Springが管理するすべてのコンポーネントの一般的なステレオタイプです。
@ Repository
、
@ Service
、および
@ Controller
は、それぞれ永続層、サービス層、プレゼンテーション層など、より具体的なユースケースのための
@ Component
の特殊化です。
最後の3つの具体的なユースケースを見てみましょう。
-
@
Controller
– クラスがaの役割を果たすことを示します。
コントローラ、およびクラス内の
@ RequestMapping
アノテーションを検出する
@
Service
** – クラスがビジネスロジックと呼び出しを保持していることを示します。
リポジトリ層のメソッド
@
Repository
** – クラスがデータリポジトリを定義することを示します。
その仕事は、プラットフォーム固有の例外を捕捉し、それらをSpringの統一された未チェック例外の1つとして再スローすることです
Q19.
DispatcherServlet
および
ContextLoaderListener
とは何ですか?
簡単に言うと、Front Controllerデザインパターンでは、受信した
HttpRequests
をアプリケーションの他のすべてのコントローラーおよびハンドラーに送信するのは単一のコントローラーによって行われます。
-
Springの
DispatcherServlet
はこのパターンを実装しているため、
HttpRequests
を適切なハンドラに正しく調整する責任があります。
一方、
ContextLoaderListener
は、Springのルート
WebApplicationContext
を起動および停止します。これは
ApplicationContext
のライフサイクルを__ServletContextのライフサイクルに結び付けます。これを使用して、さまざまなSpringコンテキストで動作する共有Beanを定義できます。
DispatcherServlet
の詳細については、リンク:/spring-dispatcherservlet[このチュートリアルへ]を参照してください。
Q20.
MultipartResolver
とは何ですか?また、いつ使うべきですか?
-
MultipartResolver
インターフェースはファイルのアップロードに使用されます** 。 SpringフレームワークはCommons FileUploadで使用するための
MultipartResolver
実装と、Servlet 3.0マルチパートリクエスト解析で使用するための別の実装を提供します。
これらを使用して、私たちのWebアプリケーションでファイルのアップロードをサポートできます。
==== * Q21。 Spring MVCインターセプターとは?その使い方は?
Spring MVCインターセプタを使用すると、クライアントのリクエストを傍受して、リクエストの処理前、処理後、またはリクエストの完了後(ビューのレンダリング時)の3か所で処理できます。
インターセプターは、分野横断的な懸念のために使用され、ロギング、Springモデルでグローバルに使用されるパラメーターの変更などのような繰り返しのハンドラーコードを避けるために使用することができます。
詳細とさまざまな実装については、https://www.baeldung.com/spring-mvc-handlerinterceptor[Spring MVC HandlerInterceptorの紹介]の記事をご覧ください。
==== Q22。 Init Binderとは何ですか?
-
@ InitBinder
というアノテーションが付けられたメソッドは、リクエストパラメータ、URIテンプレート、およびバッキング/コマンドオブジェクトをカスタマイズするために使用されます
。私達はそれをコントローラーで定義し、それはリクエストをコントロールするのを助けます。
このメソッドでは、カスタムの
__PropertyEditor
__s、フォーマッタ、およびバリデータ** を登録して設定します。
注釈は ‘
value
‘要素を持ちます。設定しないと、
@ InitBinder
アノテーション付きメソッドが各HTTPリクエストで呼び出されます。値を設定した場合、メソッドは特定のコマンド/フォーム属性やリクエストパラメータのうち、
value
要素に対応するものにのみ適用されます。
-
引数の1つは__WebDataBinderでなければならないことを覚えておくことが重要です。
ハンドラーメソッドがサポートするコマンド/フォームオブジェクトと対応する検証結果オブジェクト以外の任意の型の引数を使用できます。
==== Q23。コントローラーのアドバイスを説明する
-
@ ControllerAdvice
アノテーションを使うと、広範囲のコントローラに適用可能なグローバルコードを書くことができます** 。コントローラの範囲を選択したパッケージまたは特定のアノテーションに結び付けることができます。
デフォルトでは、
@ ControllerAdvice
は、
@ Controller
(または
@ RestController
)
のアノテーションが付けられたクラスに適用されます。より具体的にしたい場合は、使用するいくつかのプロパティもあります。
-
適用可能なクラスをパッケージに制限したい場合は、パッケージの名前を注釈に追加する必要があります**
@ControllerAdvice("my.package")
@ControllerAdvice(value = "my.package")
@ControllerAdvice(basePackages = "my.package")
複数のパッケージを使用することも可能ですが、今回は
String
の代わりに配列を使用する必要があります。
-
パッケージをその名前で制限する以外に、そのパッケージのクラスまたはインタフェースの1つを使ってそれを行うことができます。
@ControllerAdvice(basePackageClasses = MyClass.class)
‘
assignableTypes
‘要素は
@ ControllerAdvice
を特定のクラスに適用し、 ‘
annotations
‘は特定の注釈に適用します。
-
@ ExceptionHandler
** と一緒に使用する必要があることを覚えておいてください。この組み合わせにより、コントローラクラスごとに毎回実装する必要なく、グローバルでより具体的なエラー処理メカニズムを設定できます。
==== Q24。
@ ExceptionHandler
アノテーションは何をしているのですか?
-
@ ExceptionHandler
アノテーションを使うと、例外を処理するメソッドを定義できます
。
アノテーションを単独で使用することもできますが、
@ControllerAdvice
.と共に使用するほうがはるかに良いオプションです。
このようにして、すべてのコントローラ内で例外処理のためのコードを書く必要はありません
。
Spring with RESTのエラー処理
についての記事の例を見てみましょう。
@ControllerAdvice
public class RestResponseEntityExceptionHandler
extends ResponseEntityExceptionHandler {
@ExceptionHandler(value = { IllegalArgumentException.class,
IllegalStateException.class })
protected ResponseEntity<Object> handleConflict(RuntimeException ex,
WebRequest request) {
String bodyOfResponse = "This should be application specific";
return handleExceptionInternal(ex, bodyOfResponse, new HttpHeaders(),
HttpStatus.CONFLICT, request);
}
}
また、これは
IllegalArgumentException
または
IllegalStateException
をスローするすべてのコントローラーに
@ ExceptionHandler
メソッドを提供することにも注意してください。
@ ExceptionHandler
で宣言された例外は、メソッドの引数として使用された例外と一致する必要があります。そうでなければ、例外解決メカニズムは実行時に失敗します。
-
ここで留意しなければならないのは、同じ例外に対して複数の
@ ExceptionHandler
を定義することが可能であるということです。 Springは例外をスローして起動に失敗すると文句を言うので、同じクラスでそれを行うことはできません。
一方、** これらを2つの別々のクラスで定義した場合、アプリケーションは起動しますが、最初に見つかったハンドラを使用します。おそらく間違ったハンドラを使用します。
==== Q25。 Webアプリケーションでの例外処理
Spring MVCでの例外処理には3つの選択肢があります。
-
例外ごと
-
コントローラーごと
-
グローバルに
Web要求処理中に未処理の例外がスローされた場合、サーバーはHTTP 500応答を返します。これを防ぐには、
@ ResponseStatus
アノテーションを付けて
カスタム例外にアノテーションを付ける必要があります。
この種の例外はHandlerExceptionResolver__
によって解決されています。
これにより、コントローラメソッドが例外をスローしたときに、サーバは指定されたステータスコードを持つ適切なHTTPレスポンスを返します。
このアプローチが機能するためには、他の場所で例外を処理しないでください。
-
例外を処理するもう一つの方法は
@ ExceptionHandler
アノテーションを使うことです** 。
@ ExceptionHandler
メソッドを任意のコントローラーに追加し、それらを使用してそのコントローラーの内部からスローされた例外を処理します。これらのメソッドは、@ @ ResponseStatus__アノテーションなしで例外を処理したり、ユーザーを専用のエラービューにリダイレクトしたり、完全にカスタムのエラー応答を構築したりすることができます。
また、サーブレット関連オブジェクト(
HttpServletRequest
、
HttpServletResponse
、
HttpSession
、および
Principal
)をハンドラーメソッドのパラメーターとして渡すこともできます。しかし、
Model
オブジェクトを直接パラメータとして設定することはできません。
-
エラーを処理するための3番目のオプションは
@ ControllerAdvice
classes ** によるものです。特定のコントローラだけでなく、今回はアプリケーションレベルでのみ同じ手法を適用できます。これを有効にするには、
@ ControllerAdvice
と
@ ExceptionHandler
を一緒に使用する必要があります。このようにして、例外ハンドラは任意のコントローラによってスローされた例外を処理します。
このトピックに関するより詳細な情報は、https://www.baeldung.com/exception-handling-for-rest-with-spring[Spring with RESTのエラー処理]の記事を読んでください。
4結論
この記事では、Spring開発者向けの技術面接で出てくる可能性があるSpring MVC関連の質問をいくつか探りました。これは決して網羅的なリストではないので、あなたはさらなる研究の出発点としてこれらの質問を考慮に入れるべきです。
今後のインタビューでよろしくお願いします。