Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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
为Jersey中的异常返回JSON或XML_Json_Rest_Error Handling_Exception_Jersey - Fatal编程技术网

为Jersey中的异常返回JSON或XML

为Jersey中的异常返回JSON或XML,json,rest,error-handling,exception,jersey,Json,Rest,Error Handling,Exception,Jersey,我的目标是在找不到对象时在404上返回一个带有描述性消息的错误bean,并返回请求的相同MIME类型 我有一个查找资源,它将返回基于URI的XML或JSON格式的指定对象(我已经设置了com.sun.jersey.config.property.resourceConfigClass servlet参数,因此我不需要Accept标头。我的JAXBContextResolver在其类型列表中包含ErrorBean.class,并且为该类返回正确的JAXBContext,因为我可以在日志中看到) 例

我的目标是在找不到对象时在404上返回一个带有描述性消息的错误bean,并返回请求的相同MIME类型

我有一个查找资源,它将返回基于URI的XML或JSON格式的指定对象(我已经设置了com.sun.jersey.config.property.resourceConfigClass servlet参数,因此我不需要Accept标头。我的JAXBContextResolver在其类型列表中包含ErrorBean.class,并且为该类返回正确的JAXBContext,因为我可以在日志中看到)

例如:

我的NotFoundException如下所示:

public class NotFoundException extends WebApplicationException {

    public NotFoundException(String message) {
        super(Response.status(Response.Status.NOT_FOUND).
                entity(new 
                        ErrorBean(
                           message, 
                           Response.Status.NOT_FOUND.getStatusCode()
                        )
                .build());
    }

}
ErrorBean如下所示:

@XmlRootElement(name = "error")
public class ErrorBean {

    private String errorMsg;
    private int errorCode;

        //no-arg constructor, property constructor, getter and setters
        ...

}
但是,当我尝试此操作时,我总是得到一个204无内容的响应。我已经进行了黑客攻击,如果我返回一个字符串并指定mime类型,则效果很好:

public NotFoundException(String message) {
    super(Response.status(Response.Status.NOT_FOUND).
            entity(message).type("text/plain").build());
}
{"errorCode":404,"errorMsg":"Location 1 is not found!"}
我还尝试将ErrorBean作为资源返回。这很好:

public NotFoundException(String message) {
    super(Response.status(Response.Status.NOT_FOUND).
            entity(message).type("text/plain").build());
}
{"errorCode":404,"errorMsg":"Location 1 is not found!"}

对于那些未来有类似问题的人

结果证明我的代码最终还是没问题的。我当时正在努力,所以我重写了这个模块,但仍然一事无成。我的浏览器将永远挂在那里。我开始用LiveHTTPHeaders(firefox插件)检查标题,并注意到发生这种情况时,内容长度大于零。然后,我用进行了测试,发现正文返回正常。浏览器可以很好地处理XML响应,但不会显示JSON(因此挂起)。这对于我来说是很好的,因为这纯粹是应用程序使用的API,而不是用户使用的API。网站上有关于映射异常的信息