在 Jax Rs / Appfuse 应用程序中获取 HttpServletRequest?

2022-09-01 12:33:09

我使用 AppFuse 创建了一个基本的应用程序 shell,并按照 AppFuse 教程使用 Jax-RS 创建了一个简单的 RESTful 服务。这工作得很好。对 Person 对象集合的调用以 Json 格式的字符串形式返回,其中包含正确的数据。http://localhost:8080/services/api/persons

我现在想从 Appfuse 公开的 RESTful 服务中访问 和 对象(使用另一个需要这些对象的库)。ServletRequestServletResponse

我认为这应该可以通过添加@Context注释来实现,例如,在此StackOverflow帖子和此论坛帖子之后。

但是,如果我添加@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上运行这个。

=== 异常堆栈跟踪(截断) ===

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 

答案 1

尝试直接注入 和:HttpServletRequestHttpServletContext

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

答案 2

将其添加到方法签名中有效。我想这是因为当类被实例化时,请求和响应对象还不存在,但是当浏览器调用时,请求和响应对象仍然存在。

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