2013-04-06 42 views
4

考慮以下服務:EJB JAX-RS @Context HttpServletRequest NullPointerException - 爲什麼?

@Path("/") 
@Stateless 
public class SomethingService { 

    @Context 
    final HttpServletRequest request 

    @POST 
    @Path("post/something/") 
    @Produces("application/json; charset=UTF-8") 
    public String addSomething(@FormParam("something") final String something) { 
     // access to request methods results in NullPointerException 
    } 
} 

我得到了NullPointerException的方法執行時,雖然在調試角度來看,我注意到request是不是真的null而是org.apache.openejb.rest.ThreadLocalHttpServletRequest一個實例。當我移動@Context注射方法的參數水平,一切工作正常:

public String addSomething(@FormParam("something") final String something, 
    @Context final HttpServletRequest request) { ... } 

,這是什麼原因呢?據我記得,在我做服務之前,它曾經工作過一個EJB(我使用@EJB@Inject注入了DAO)。 JAX-RS是否爲每個請求創建了一個這樣的服務實例,因此能夠通過類級別@Context注入?在JAX-RS可以做任何事情之前,EJB是否通過創建實例並填充代理對象來防止這種情況發生?

回答

1

necroing一個老問題 -

當你變成無國籍這一點,它變成了一個單身的模式,所以注射領域不再是線程安全的。將jax-rs服務轉換爲Spring bean時會發生同樣的情況。執行此操作的更安全方法是您提到的解決方法,並注入方法參數。

相關問題