我编写了使用REST JAX-RS生成Excel文件的代码,并确认生成的Excel文件位于GlassFish服务器目录中.
但我的目标是当用户点击按钮(生成Excel .xls)时,我想要下载弹出窗口,询问用户是否保存或打开.xls文件,就像任何其他Web服务用于下载任何类型的文件一样.
根据我的搜索,步骤是:
生成Excel .xls(DONE)
将excel写入流
在JAX-RS文件中,将响应头设置为类似的,
String fileName ="Blah_Report.xls"; response.setHeader("Content-Disposition","attachment; filename ="+ fileName);
我的问题是我在JAX-RS文件中做了所有这些,而且我没有可用的HttpServletResponse对象.
根据Add Response Header到JAX-RS Webservice的答案
他说:
您可以通过Web服务中的@Context注释注入对实际HttpServletResponse的引用,并使用addHeader()等来添加标头.
如果没有示例代码,我无法确切地说明这意味着什么.
我有一个对象,我想在JSON中作为RESTful资源提供服务.我打开了Jersey的JSON POJO支持(在web.xml中):
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Run Code Online (Sandbox Code Playgroud)
但是当我尝试访问该资源时,我得到了以下异常:
SEVERE: A message body writer for Java type, class com.example.MyDto, and MIME media type, application/json, was not found
SEVERE: Mapped exception to response: 500 (Internal Server Error)
javax.ws.rs.WebApplicationException
...
Run Code Online (Sandbox Code Playgroud)
我正在尝试提供的类并不复杂,所有它都是一些公共final字段和一个设置所有它们的构造函数.这些字段都是字符串,基元,与此类似的类或其列表(我尝试使用普通列表而不是通用List <T>,但无济于事).有谁知道是什么给出的?谢谢!
Java EE 6
泽西岛1.1.5
GlassFish 3.0.1
@Provider
public class JerseyExceptionMapper implements ExceptionMapper<JerseyException> {
@Override
public Response toResponse(JerseyException jerseyException) {
return Response.status(jerseyException.getErrorCode()).
entity(jerseyException.getJsonResponseObj()).
type(MediaType.APPLICATION_JSON).
build();
}
}
Run Code Online (Sandbox Code Playgroud)
当您在中使用<error-page>组件时,上面的代码会产生不需要的结果web.xml.例如,如果my Response.status设置为400而我的error-page组件定义<error-code>为400,则Web服务器会将请求重定向到中定义的位置web.xml.
这显然不是我想要的REST请求.我在StackOverflow上读了另一篇帖子,说明了请求被转移到的原因error-page是因为HttpServletResponse.sendError(400)设置了.该帖子说如果你设置了HttpServletResponse.setStatus(400),那error-page将被忽略.
如果这是真的,我不知道它是如何有用的,因为我没有实现Jersey代码.我看到的选项是调查Response类源代码,并可能重新实现status方法或其他Jersey代码.这里有一个简单的选择还是我缺少的东西?
从本质上讲,我的问题是:鉴于我正在使用Jersey for REST而我正在使用错误页面,我web.xml如何使用上面的代码而忽略了error-page仅用于Jersey代码?导致HTTP错误的任何其他代码都应该转到error-page.或者是否有其他解决方案不涉及error-page但将与我想要的工作相同?
在我的应用程序中,我有不同的层,如休息层,服务层和数据库层,根据业务场景我从服务层投掷不同的业务异常.
但是现在,我必须为REST响应设置不同的HTTP代码,如400,403,409,412 ..
如何根据不同的场景设置不同的HTTP状态码?
哪种方式最可行:方面,异常映射器或....?
由于我只能在rest层中设置一次HTTP状态( 引用这个),因此我无法映射到不同的HTTP代码,因为我的异常来自服务层.
我的异常类看起来像这样:
public class BusinessException extends RuntimeException {
private static final long serialVersionUID = 1L;
public BusinessException(ErrorEnumeration error) {
}
public BusinessException(Exception e, ErrorEnumeration error) {
}
}
Run Code Online (Sandbox Code Playgroud)
并且将从服务抛出异常,如下所示:
throw new BusinessException(ErrorEnumeration.VALIDATION_FAILED);
Run Code Online (Sandbox Code Playgroud)
建议解决方案请帮助
我有一个在 Jboss 7 (EAP 6.4) 上运行的 EE6 JAX-RS 应用程序,并通过ExceptionMapper.
不过,在某些情况下(最明显的是当 HTTP 基本身份验证失败时),由于错误发生在调用应用程序之前,因此不会调用此方法,因此客户端会获取服务器的默认错误页面(JBWEB bla bla,具有难看的紫色的 HTML) )。
现在为了捕获这些“外部”错误,我添加了<error-page>定义,web.xml如下所示:
<error-page>
<location>/error.json</location>
</error-page>
<error-page>
<error-code>401</error-code>
<location>/error401.json</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)
该位置工作正常,我几乎得到了我想要的响应,但 HTTP 状态代码始终为 200。
至少可以说,这很烦人。如何让错误页面返回正确的错误代码?
我有一个RESTful服务器实现以及一个供客户端进行调用的库,所有这些都使用JAX-RS。服务器组件分为接口FooResource和实现FooResourceService。
为了使客户端和服务器库共享RESTful路径和其他定义,我想将FooResource接口拆分为自己的项目:
@Path(value = "foo")
public interface FooResource {
@GET
public Bar getBar(@PathParam(value = "{id}") int id) {
Run Code Online (Sandbox Code Playgroud)
我想在响应中设置一些标题。一种简单的方法是@Context HttpServletResponse在方法签名中使用:
public Bar getBar(@PathParam(value = "{id}") int id, @Context HttpServletResponse servletResponse) {
Run Code Online (Sandbox Code Playgroud)
但是问题在于这暴露了接口中的实现细节。更具体地说,它突然需要我的REST定义项目(在客户端和服务器库之间共享)来引入javax.servlet-api依赖项-客户端不需要(或不需要)某些东西。
我的RESTful资源服务实现如何设置HTTP响应标头而不在资源接口中引入依赖关系?
我看到一篇推荐我将HttpServletResponse作为类成员注入的帖子。但是,如果我的资源服务实现是单例的,这将如何工作?它是否使用某种具有线程局部变量的代理,或者即使多个线程同时使用singleton类,也能找出正确的servlet响应的代理?还有其他解决方案吗?
java ×6
rest ×4
jax-rs ×3
jersey ×2
cxf ×1
glassfish-3 ×1
header ×1
http ×1
httpresponse ×1
jakarta-ee ×1
java-ee ×1
json ×1
servlet-3.0 ×1