Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于逻辑返回不同媒体类型的Spring Rest服务_Java_Spring_Rest_Spring Mvc_Jax Rs - Fatal编程技术网

Java 基于逻辑返回不同媒体类型的Spring Rest服务

Java 基于逻辑返回不同媒体类型的Spring Rest服务,java,spring,rest,spring-mvc,jax-rs,Java,Spring,Rest,Spring Mvc,Jax Rs,救命啊!我尽我所能,但似乎什么都不管用。我的问题如下: 我有一个SpringREST服务,它进行REST调用,接收base64编码的PDF。然后我对PDF进行解码,并将其显示在浏览器中。我可以让这部分完美地工作!但是我在处理404、500等时遇到问题。错误消息 不幸的是,错误消息在API中作为hashmap中的消息返回给我,正如我下面的逻辑所示 我尝试过创建PDF,但我无法将其转换为文件对象,我尝试过将字节直接流式传输到浏览器,但无论我做什么,它都不适用于我 有没有办法根据逻辑更改响应头?成功时

救命啊!我尽我所能,但似乎什么都不管用。我的问题如下:

我有一个SpringREST服务,它进行REST调用,接收base64编码的PDF。然后我对PDF进行解码,并将其显示在浏览器中。我可以让这部分完美地工作!但是我在处理404、500等时遇到问题。错误消息

不幸的是,错误消息在API中作为hashmap中的消息返回给我,正如我下面的逻辑所示

我尝试过创建PDF,但我无法将其转换为文件对象,我尝试过将字节直接流式传输到浏览器,但无论我做什么,它都不适用于我

有没有办法根据逻辑更改响应头?成功时返回pdf,错误时返回文本文件到浏览器

我在这里筋疲力尽,不知道该去哪里。如有任何建议或建议,将不胜感激

我也尝试过在浏览器中使用404,但它需要一个pdf文件,我收到了MIME错误

@Controller
@Path("/mon")
public class WSController {

    @Autowired
    Service service;

    @GET
    @Produces("application/pdf")
    @Path("/ws")
    public File getWs(@QueryParam("vin") String vin) throws IOException, URISyntaxException {
        Map response = service.getWs(vin);
        if (response == null) {
            return createErrorFile("Server Error, please try again later.");
        } else if (response.get("ErrorCode") != null && response.get("ErrorCode").equals("E")) {
            return createErrorFile((String) response.get("ErrorDescription"));
        } else {
            return decodeBase64(((String) response.get("Base64String")).replace("\n",""));
        }
    }

    private File decodeBase64(String encodedFile) throws IOException {
        byte[] decodedBytes = DatatypeConverter.parseBase64Binary(encodedFile);

        File file = new File("wS.pdf");
        FileOutputStream fop = new FileOutputStream(file);

        fop.write(decodedBytes);
        fop.flush();
        fop.close();

        return file;
    }

    private File createErrorFile(String errorDescription) throws IOException {
        //Not sure what to do here
        return null;
    }
编辑:以下是我的工作成果。非常感谢你的建议。这是一次美妙的学习经历

@GET
@Path("/ws")
public Response getWS(@QueryParam("vin") String vin) throws IOException, URISyntaxException {
    Map results = Service.getWS(vin);
    if (results == null) {
        Response.ResponseBuilder rBuild = Response.status(Response.Status.BAD_REQUEST);
        return rBuild.type(MediaType.TEXT_PLAIN)
                .entity("Server error, please try again later.")
                .build();
    } else if (results.get("ErrorCode") != null && results.get("ErrorCode").equals("E")) {
        Response.ResponseBuilder rBuild = Response.status(Response.Status.BAD_REQUEST);
        return rBuild.type(MediaType.TEXT_PLAIN)
                .entity(results.get("ErrorDescription"))
                .build();
    } else {
        File responseData = decodeBase64(((String) results.get("Base64String")).replace("\n", ""));
        Response.ResponseBuilder rBuild = Response.ok(responseData, "application/pdf");
        return rBuild.build();
    }
}
不要惊慌:-)您可以通过向spring请求HttpServletResponse对象来实现对响应的完全控制。您可以设置响应的mime类型或设置错误代码:

@GET
@Produces("application/pdf")
@Path("/ws")
public void getWs(@QueryParam("vin") String vin, HttpServletRequest request) {
...
...
request.setContentType("text/html");
...

我看到了你在帖子中提到的一些问题,但我只看到了这些实际问题

有没有办法根据逻辑更改响应头?成功时返回pdf,错误时返回文本文件到浏览器

因此,我将解决这些问题。我自己,我更喜欢总是返回一个。您可以在那里设置所有标题,以及更多内容。比如说

@GET
public Response getSomething() {
    ...
    Response.ResponseBuilder builder = Response.status(200);
    Response response = builder.entity(file)
                               .header("Content-Type", "someType")
                               .build();
    return response;
}
实体(…)
通常作为实体体返回

  • 有关详细信息,请参见API。
    Response
    中的大多数静态方法返回一个
    Response.ResponseBuilder
    ,因此有许多选项来构建请求
对于方法中没有处理的异常,您可以使用一个正确的方法来处理不同的异常。看见您可以从映射器返回
响应


您可以编写自定义代码,这样就不会因为异常的响应构建而使代码混乱。然后抛出那个异常。JAX-RS已经内置了一种机制来处理异常。您可以使用内置的
响应创建异常。链接有一个例外。处理异常有很多不同的选项。

当发生错误时,您不能将响应重定向到另一个URL位置吗?我也研究了这个问题。(sendRedirect(request,response,targetUrl)),但我不确定获取请求/响应对象的最佳方式。这样设置标题会覆盖我的注释吗?我现在正在尝试这个实现。将让您知道它是如何运行的。当然,您应该删除“@products”并显式设置MIME类型。返回响应对象是更好的做法吗?如果你能用这些方法控制标题、正文等,可能会更好。这是你的首选。还有其他设置标题的方法。但是既然实用程序已经存在,为什么不使用它呢。您可以注入HttpServletResponse,但我不喜欢这样。对我来说,反应似乎更干净。除了标题,您还可以对响应做更多的事情。只需查看所有Response.ResponseBuilder方法。身体也没有任何变化。这与您返回的文件相同。该响应只是一个完整http响应的ITERMEDIALY包装器。这正是我所做的。我会把我的固定密码贴在OP上。