AppFuseで基本的なアプリケーションシェルを作成し、 AppFuseチュートリアル に従って、Jax-RSで簡単なRESTfulサービスを作成しました。それはうまく機能します。 http://localhost:8080/services/api/persons
を呼び出すと、Personオブジェクトのコレクションが、正しいデータを含むJson形式の文字列として返されます。
Appfuseによって公開されたRESTfulサービス内から(これらのオブジェクトを必要とする別のライブラリを使用するために)ServletRequest
およびServletResponse
オブジェクトにアクセスしたいと思います。
Ithinkこれは、@ Contextアノテーションを追加することで実行できるはずです。この StackOverflow post およびこの forum post に続きます。
しかし、@ Contextタグ(以下を参照)を追加すると、コンパイルは正常に行われますが、サーバーの再起動時に例外がスローされます(下部に接続されます)。
@WebService
の宣言は次のとおりです。
@WebService
@Path("/persons")
public interface PersonManager extends GenericManager<Person, Long> {
@Path("/")
@GET
@Produces(MediaType.APPLICATION_JSON)
List<Person> read();
...
}
そして、これが@Context
アノテーションを呼び出すと思う実装クラスです:
@Service("personManager")
public class PersonManagerImpl extends GenericManagerImpl<Person, Long> implements PersonManager {
PersonDao personDao;
@Context ServletRequest request; // Exception thrown on launch if this is present
@Context ServletContext context; // Exception thrown on launch of this is present
...
}
単純に、動作させるために含めるもの、またはServletRequestを取得することが不可能であることに気付くもののいずれかが不足していることを願っています。
これをIntelliJのTomcatで実行しています。
=== EXCEPTION STACK TRACE(切り捨て)===
Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'serviceBeans' threw exception; nested exception is Java.lang.RuntimeException: Java.lang.NullPointerException
at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.Java:102)
at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.Java:58)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.Java:1358)
... 37 more
HttpServletRequest
とHttpServletContext
を直接注入してみてください:
@Context private HttpServletRequest servletRequest;
@Context private HttpServletContext servletContext;
メソッドシグネチャへの追加が機能しました。これは、クラスがインスタンス化されたときには要求オブジェクトと応答オブジェクトがまだ存在していないが、ブラウザによって呼び出されたときに存在するためだと思います。
@Path("/")
@GET
@Produces(MediaType.APPLICATION_JSON)
List<Person> read( @Context HttpServletRequest httpServletRequest, @Context HttpServletResponse httpServletResponse) { }