如何在Restlet中发送错误响应?

时间:2015-11-25 08:36:08

标签: java web-services rest restlet

我有一个Restlet ServerResource,它应该使用参数user处理GET请求。如果user等于某个值,则应返回一些图像,否则发送错误响应(404或403),表示不允许发件人获取图像。

import org.restlet.data.MediaType;
import org.restlet.representation.ObjectRepresentation;
import org.restlet.representation.Representation;
import org.restlet.resource.Get;
import org.restlet.resource.ResourceException;
import org.restlet.resource.ServerResource;

public class GetMap extends ServerResource {
    @Get
    public Representation getImage() {
        final String user = getQuery().getValues("user");

        if (user.equals("me")) {
            //Read map from file and return it
            byte[] data = readImage();
            final ObjectRepresentation<byte[]> or=new ObjectRepresentation<byte[]>(data, MediaType.IMAGE_PNG) {
                @Override
                public void write(OutputStream os) throws IOException {
                    super.write(os);
                    os.write(this.getObject());
                }
            };
            return or;
        }
        return null; // Here I want to send an error response
    }
    [...]
}

如何使用getImage方法(而不是return null)发送标准化错误响应?

2 个答案:

答案 0 :(得分:5)

查看ServerResource#setStatus(Status) method JavaDoc以及其他重载方法。这允许您返回自定义正文以及所需的HTTP状态。

或者抛出new ResourceExceptionclass JavaDoc)框架会将这些转换为正确的HTTP状态并提供默认消息,尽管这不太可能是图像。

这应该符合您的需求。 JavaDoc链接到2015年11月25日版本2.3.x

答案 1 :(得分:4)

过去,我写过一篇关于此事的博文:

除了伟大的Caleryn的答案之外,现在还有@Status注释在Restlet中使用自定义异常。样本:

@Status(value = 400, serialize = true)
public class MyValidationException extends RuntimeException {
    public ServiceValidationException(String message, Exception e) {
        super(message, e);
    }
}

抛出此类异常时,Restlet会自动检测它并创建相应的错误消息。在示例中,使用状态代码400的响应,它尝试使用转换器服务将异常序列化为bean到JSON(或其他)。

希望它可以帮到你, 亨利