web-dev-qa-db-ja.com

intellijがJSPコードインスペクションまたはオートコンプリート内でel変数を解決しない

ここに示されている答えを要約すると EclipseのSpring MVCモデルオブジェクトの(jsp/jstl)ビューのコードアシスト はまったく機能しません。変更する必要のある設定はありますか?

サンプルをダウンロードしました spring-mvc-showcase githubにありますが、そのプロジェクトではそのままでは機能しません(11.1.3またはEAP 12バージョンの両方で完全なエンタープライズエディション)。以下を参照してください(formBeanがどこから取得されるのかわかりません):

fruit and foo, both work, but not available as autocomplete options

これは私自身のプロジェクトの例です。下のスクリーンショット(下のフレーム)は、コントローラーがモデルに文字列属性を追加し、正しいビュー名を返すことを示しています。その場合、そのビューを編集するときに、shopStringがオートコンプリートオプションとして提供されることを期待しますが、そうではありません。 JSP shown abover controller, the autocomplete offered up when "s" typed

sgはjavascript変数です-そこにあるはずですが、「shopString」はどこにありますか?この機能を取得するために変更する必要のある設定や不足しているものはありますか(すべてのSpringプラグインで11.1.3 Enterprise Editionを使用)。

また、春固有の変数でも失敗しています: enter image description here

彼らのオープンソース(春のチュートリアルプロジェクトの1つですか?)はこれが間違いなく機能しますか...またはIntellijインストールで変更が必要な設定がありますか(バージョン12 EAPの新しいダウンロードでテストしました)?

以下のもう1つのスクリーンショットは、自動検出を介して正しくセットアップされたすべてのSpring Coifgファイルを示していますが、コード検査は失敗します...これは spring-mvc-showcase プロジェクトです: code inspection and spring config

15
NimChimpsky

これを行うための標準的な方法がありますが、これはIntelliJ固有ではありません。

<jsp:useBean id="someModel" scope="request" type="foo.bar.SomeModelClass"/>

ここでのtype属性は、具象クラスである必要はなく、インターフェース型でもかまいません。通常、これらの宣言は、JSP/JSPXファイルの先頭に配置して、「モデル入力の宣言」のようなものを提供します。

実際、Springに関する元の本では、このような宣言的な方法でJSPを使用することが推奨されていました(Expert One-on-One J2EE Design and Development。)。 IntelliJは、少なくとも7年間、このようなページの完全なコード補完を提供してきました。

IntelliJには、関連する便利な機能が追加されていることに注意してください。EL変数参照が未定義としてマークされている場合は、Alt-Enterを押してQuickFixを選択すると、上記のような宣言が挿入されます。アクセスしているプロパティに基づいて、実際のタイプを把握しようとします。

24
Pakka Pakka

私がSpringを理解しているように、モデルに入れることができる変数の定義についての宣言はありません。 model.addAttribute()の呼び出しは、パラメータによって識別されるか、オブジェクトのクラス名によって自動的に生成されるオブジェクトをモデルに追加する場合があります。

したがって、複数のメソッドがある次のケースを想像してみてください。

@RequestMapping("foo") public String foo(Model model) { 
    model.addAttribute("model", new Foo());
    return new Random().nextBoolean() ? "page" : "someOtherPage";
}
@RequestMapping("bar") public String bar(Model model) { 
    model.addAttribute("model", new Bar());
    model.addAttribute("model", new Foo());
    model.addAttribute("model", new Bar());
    return new Random().nextBoolean() ? "page" : "someOtherPage";
}

そして、JSPは次のよ​​うになります

<c:out ${model.value} />

状況によっては、どのコントローラーがどのビューに転送されるか、また何がモデル内に正確に存在するかについての適切なマッピングがないため、IDEは適切な情報を提供する実際の機会がありません。

ただし、IDEが有用な情報を提案するのをサポートするには、型ヒントを使用できます。したがって、オブジェクトの参照全体をコピーする必要があります。たとえば、fooおよび次のようなJSPコメントを追加します。

<%--@elvariable id="foo" type="com.mycompany.SomeObject"--%>

警告は消え、完全なIDEサポートはあなたの側にあり、fooフィールドをトラバースすることができます。最も良いことの1つは未使用のゲッター警告も消えます。使用法の表示アクションをJSPまたはPOJOから直接呼び出すことができます。

これはJSFでも機能し、特にJSFコンポーネント内で機能します。警告とエラーを表示して、この種のコードを補完する非常に優れた機能。

IntellijIdeaへの切り替えに役立つことを願っています。

編集:私はまた、この発見を友人に報告し、すべてを素敵なブログエントリにまとめました。多分あなたはそれを読むことに興味があります: リンクを開く

13
mana

自分のインターセプターを書き始めたとき、私は同様の問題に直面しました。問題は、ビューリゾルバー構成で参照を使い始めることでした xml issue

このような構造を使用しないでください

<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" ref="prefix"/>
    <property name="suffix" ref="suffix"/>
</bean>-
0
Andrew

これは、最新リリースの intellij 122.694fixedになりました

0
NimChimpsky