開発者ドキュメント

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関連の質問をいくつか探りました。これは決して網羅的なリストではないので、あなたはさらなる研究の出発点としてこれらの質問を考慮に入れるべきです。

今後のインタビューでよろしくお願いします。

モバイルバージョンを終了