【问题标题】:Why do I get Error method has more than one entity. You must use only one entity parameter为什么我得到错误方法有多个实体。您只能使用一个实体参数
【发布时间】:2022-11-05 02:02:18
【问题描述】:

我正在为 JAVA EE 开发一个 servlet,并不断收到此错误“错误 Viewerpage.index 方法具有多个实体。您必须只使用一个实体参数。”

@ApplicationPath("REST2")
@Path("/viewer")
public class Viewerpage extends Application {
private GlobalConfiguration globalConfiguration;
private ViewerService viewerService;

@GET
@Path(value = "/viewer")
public Response index(String filename, String page, HttpServletResponse response) throws IOException {
    // set headers before we write to response body
    response.setStatus(HttpServletResponse.SC_OK);
    response.setContentType(MediaType.TEXT_HTML);

    // render a page of a file based on a parameters from request
    renderPage(filename, response.getOutputStream());

    // complete response
    response.flushBuffer();
     String value = "redirect:index";
    return Response.status(Response.Status.OK).entity(value).build();

}

private void renderPage(String filename, OutputStream outputStream) {
    String filepath = "storage/" + filename;

    // render first page
    MemoryPageStreamFactory pageStreamFactory = new MemoryPageStreamFactory(outputStream);
    HtmlViewOptions viewOptions = HtmlViewOptions.forEmbeddedResources(pageStreamFactory);

    Viewer viewer = new Viewer(filepath);
    viewer.view(viewOptions);
    viewer.close();
}
}

任何想法是什么导致这个错误?

【问题讨论】:

    标签: java jax-rs


    【解决方案1】:

    当你声明一个资源方法时,你只能有是请求实体的参数。参数没有任何注释都被视为实体主体。所有其他参数必须有某种注释来指定它是什么以及应该注入什么。如果是查询参数,请使用@QueryParam。如果是路径参数,使用@PathParam。如果它是其他一些非参数可注入(支持),例如HttpServletRequest,然后使用@Context。其他支持的“Param”可注入类型为@HeaderParam@FormParam@CookeParam@MatrixParam 等。

    【讨论】:

      【解决方案2】:

      想想流式传输到客户端的 HTTP 响应。您正在发送它

      response.setStatus(HttpServletResponse.SC_OK);
      response.setContentType(MediaType.TEXT_HTML);
      renderPage(filename, response.getOutputStream());
      response.flushBuffer();
      

      但是,之后(最多应该关闭响应流时),您尝试做一些看起来像构建第二个响应的事情:

      Response.status(Response.Status.OK).entity(value).build();
      

      由于每个响应只能有一组标头和正文,因此您不能返回设置标头或发送第二个响应实体。这就是错误所在。

      【讨论】:

      • 谢谢您的帮助!请问我在哪里可以了解有关此信息的更多信息?
      猜你喜欢
      • 1970-01-01
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      相关资源
      最近更新 更多