2012-03-08 11 views
23

AppFuseで基本的なアプリケーションシェルを作成し、AppFuse tutorialの後にJax-RSを使って簡単なRESTfulサービスを作成しました。それはうまく動作します。 http://localhost:8080/services/api/personsの呼び出しは、適切なデータを持つJson形式の文字列としてPersonオブジェクトのコレクションを返します。Jax Rs/AppfuseアプリケーションでHttpServletRequestを取得しますか?

Appfuseが公開しているRESTfulサービス(これらのオブジェクトを必要とする別のライブラリを使用するため)でServletRequestServletResponseオブジェクトにアクセスしたいとします。

I @Context注釈を追加することで実現できるはずです。このStackOverflow postとこのforum postの後に続きます。

@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 
    ... 
    } 

:ここ

@WebServiceの宣言です:

@WebService 
@Path("/persons") 
public interface PersonManager extends GenericManager<Person, Long> { 
    @Path("/") 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    List<Person> read(); 
    ... 
} 

そして、ここで私は@Context注釈を呼ぶだろうと思うの実装クラスですServletRequestを取得することが可能ではないと考えていることを認識するために... ....手がかりを歓迎します。

IntelliJのTomcatでこれを実行していますか?

===例外スタックトレース(切り捨て)===

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 

答えて

33

直接HttpServletRequestHttpServletContextを注入してみてください:メソッドシグネチャに追加

@Context private HttpServletRequest servletRequest; 
@Context private HttpServletContext servletContext; 
+1

ありがとうございます!これは書かれたとおりには動作しませんでしたが、別の例外がありました.ServletRequestだけでなくHttpServletRequestを参照するというアイデアは、正しくインクルードする方法を理解するための完璧な手掛かりでした。適切なチェックではなく+1ですか? – prototype

+0

Hmmm thats odd。実際に機能しているプログラムから直接コードを貼り付けました。他の人に恩恵を受けることができるように、あなたの解決策を回答として投稿してください。 – Perception

+0

次に、安らかなサービスがどのように機能するかを知るために、自分のリストに追加する必要がある別のアイテムが必要です。それを知っていることも役に立ちます。再度、感謝します! – prototype

23

が働きました。リクエストとレスポンスのオブジェクトは、クラスがインスタンス化されるときにはまだ存在しないが、ブラウザーによって呼び出されたときにはそのオブジェクトが存在しないためだと思います。

@Path("/") 
@GET 
@Produces(MediaType.APPLICATION_JSON) 
List<Person> read(@Context HttpServletRequest httpServletRequest, @Context HttpServletResponse httpServletResponse) { } 
+0

驚くべきことに、これはSpringや他のCDIフレームワークを使用していなくても機能します。 – coladict

関連する問題