相关疑难解决方法(0)

如何在JAX-RS中设置响应头,以便用户看到Excel的下载弹出窗口?

我编写了使用REST JAX-RS生成Excel文件的代码,并确认生成的Excel文件位于GlassFish服务器目录中.

但我的目标是当用户点击按钮(生成Excel .xls)时,我想要下载弹出窗口,询问用户是否保存或打开.xls文件,就像任何其他Web服务用于下载任何类型的文件一样.

根据我的搜索,步骤是:

  1. 生成Excel .xls(DONE)

  2. 将excel写入流

  3. 在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()等来添加标头.

如果没有示例代码,我无法确切地说明这意味着什么.

java rest header jax-rs glassfish-3

47
推荐指数
2
解决办法
10万
查看次数

我如何使用Jersey JSON POJO支持?

我有一个对象,我想在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

java rest json jersey java-ee

40
推荐指数
4
解决办法
10万
查看次数

使用Jersey的ExceptionMapper忽略web.xml错误页面

@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但将与我想要的工作相同?

java jax-rs jersey

10
推荐指数
1
解决办法
2295
查看次数

如何为休息服务中的异常返回http状态代码

在我的应用程序中,我有不同的层,如休息层,服务层和数据库层,根据业务场景我从服务层投掷不同的业务异常.

但是现在,我必须为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)

建议解决方案请帮助

java rest cxf http

6
推荐指数
1
解决办法
2万
查看次数

web.xml 中定义的 &lt;error-page&gt; 始终返回 HTTP 状态 200

我有一个在 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。

至少可以说,这很烦人。如何让错误页面返回正确的错误代码?

java error-handling servlet-3.0 jakarta-ee

5
推荐指数
1
解决办法
2075
查看次数

在实现中设置JAX-RS响应标头,而无需在接口中暴露HttpServletResponse

我有一个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 rest jax-rs httpresponse

4
推荐指数
1
解决办法
6150
查看次数