2017-01-12 18 views
0

私は、SpringブートテンプレートからPDFを生成できる必要があります。このために、私は主に正しく仕事をするPDFレンダリングライブラリ(FlyingSaucer)を使用しています。しかし、1つの問題があります。ページに「href」タグがあると、PDFレンダラーがHTMLをレンダリングしようとしたときに正しく解決されません。たとえば、私は次のコードがある場合:Spring BootでClassPathResourceとして静的リソース(js、css)を取得する方法は?

<link rel="stylesheet" type="text/css" th:href="@{/css/index.css}" /> 

それはブラウザで正しく解決されますが、私は次のコードを使用してクラスパスリソースとしてこれを取得しようとすると:

new ClassPathResource("/css/index").getInputStream() 

春ブーツは言いますファイルが存在しないことを確認します。これは私にとっては奇妙なことです。私は、Spring Bootがすべての静的コンテンツをクラスパスに追加すると考えていたからです。以下は

正しい春ブートconvetionを次の(と思う)私のプロジェクトのフォルダ構造、次のとおりです。

Project Structure

私はオートワイヤリングを通していくつかの春のリソース(アプリケーション・コンテキストのハンドルを取得することができますなど)は、ブラウザが要求したときと同じようにこれらのURLを解決しますか? URL文字列の先頭に "resources/static /"をハードコードすることでこれを回避することができますが、もっとダイナミックなソリューションが好まれます。

答えて

0

様々なソリューションを試した後、私はAmant Simghによって与えられた答えにもかかわらず、任意のパスをハードコーディングするために私を必要としない、1を思い付くことができました。私は私のソリューション(画像を使用し、Tomcatコンテナに展開し、 "bootRun"を実行し、webjarsを使用して展開する)でたくさんのものを投げました。

内部的には、SpringブートはResourceHttpRequestHandlerクラスを使用してリソースを解決します。これにより、Springブートアプリケーションは@Autowire ResourceHttpRequestHandler Beanにアクセスできます。だから、Javaコードからバックエンドから静的リソースを取得するためには、次の操作を実行できます。

@Autowired 
ResourceHttpRequestHandler resourceHandler; 

String uri = "/css/mycss.css"; 
Resource resource; 
for (ResourceResolver resourceResolver : resourceHandler.getResourceResolvers()) 
{ 
    resource = resourceResolver.resolveResource(null, uri, resourceHandler.getLocations(), null); 
    if (resource != null) 
     break; 
} 

これは、静的なリソースを要求するときSpringBootが何をしているのか、本質的です。

重要:アプリケーションにコンテキストパスがある場合(つまり、「myapp」アプリケーションをデプロイしてからコンテキストパスが「/ myapp /」になる場合)、この例のURIからコンテキストパスを削除する必要があります上記。幸いにも、これは次のようにして簡単に行うことができます:

ServletContext context = // get servlet context somehow 
String uriWithoutContext = uri.replace(context.getContextPath(), ""); 
1

これを使用して:

new ClassPathResource("static/css/index.css").getInputStream(); 
+0

「静的な」ハードコードはありませんか? – Pell000

+0

春、リソースの標準クラスパスは "src/main/resources"です。それ以降は完全なパスを追加する必要があります。もちろん、パターンマッチングなどの利点を得ることができますが、最終的にはそれを提供する必要があります。 –

+0

私の答えを参照してください。私はいくつかのSpringコンポーネントを使用して完全なパスを提供することなく、これを行うことができました。私は "src/main/resources/static"もクラスパスに置かれていると思います。しかし、私の理解が間違っている場合は、私に知らせてください。 – Pell000

関連する問題