Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.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 设计:确保响应呈现与响应呈现的清晰分离_Java_Rest_Design Patterns_Servlets - Fatal编程技术网

Java 设计:确保响应呈现与响应呈现的清晰分离

Java 设计:确保响应呈现与响应呈现的清晰分离,java,rest,design-patterns,servlets,Java,Rest,Design Patterns,Servlets,这是一个设计/模式问题。我有一个现在也需要的服务 以RESTful web服务的形式公开 在现有代码中,我有一个请求、一个套件的概念 可能的服务操作(策略)和任何服务操作的返回 响应对象。这种方法可以解耦系统的内部工作 来自表示介质的服务(自定义TCP服务器、HTTP REST、HTTP 肥皂等) 我现在开始实现一个MyServiceRESTfulServlet,它看起来像 像这样: public void doGet(HttpRequest httpRequest, HttpResponse

这是一个设计/模式问题。我有一个现在也需要的服务 以RESTful web服务的形式公开

在现有代码中,我有一个请求、一个套件的概念 可能的服务操作(策略)和任何服务操作的返回 响应对象。这种方法可以解耦系统的内部工作 来自表示介质的服务(自定义TCP服务器、HTTP REST、HTTP 肥皂等)

我现在开始实现一个MyServiceRESTfulServlet,它看起来像 像这样:

public void doGet(HttpRequest httpRequest, HttpResponse httpResponse) throws ServletException, IOException {
    try {
        /* Wrap an http servlet request with an adapter which hides all
         * the messy details of an HttpRequest and exposes a nice interface
         * for working with MyService
         */
        IRequest serviceRequest = new MyServiceRESTfulRequest(httpRequest);

        /* There's nothing HTTP related in this part, it's the exact same
         * code you'd find in other presentation formats. A Response has
         * no idea about HTTP, TCP Servers or the like.
         */
        Response serviceResponse = dispatchRequest(serviceRequest);

        /* A static helper which knows the interface of a Response
         * and can translate that into REST-speak for feeding back via
         * an HttpServletResponse.
         */
        renderRESTfulResponse(serviceResponse, httpResponse);
    } catch (Exception e) {
        throw new ServletExcetion(e);   // Caught by a seperate
                                        // RESTfulErrorServlet
                                        // configured in web.xml
                                        // Rendering an appropriate
                                        // response.
    }
}
我的问题是,当前的响应可能有两种:

public enum ResponseKind() {
    BINARY, METADATA;
}
对于二进制文件,我的restful响应助手将以一种方式呈现元数据 它需要适当地呈现元数据—一个HTML表、一个JSON表 斑点等

找出哪种类型比较容易-响应对象公开 getOriginalRequest(),经过适当的检查后,可以将其转换为 MyServiceRESTfulRequest,它公开了一个.getAcceptablePresentation()-一个 枚举:

如何最好地保持此渲染代码与响应对象的解耦。 毫无疑问,在未来,其他类型的反应将是可能的。事实上, renderRESTfulResponse()遍历请求对象并生成 适当地写出数据。它与两个 响应接口(我可以接受),但它知道如何通过 请求对象也是

我只是觉得我没有以一种干净和可维护的方式完成这一点 因为我有剩余的服务。我是每一个“特殊套管” 可能的响应类型,以及每种可能的响应格式。感觉 超级黑客

您能提出任何方法来干净地处理呈现RESTful响应吗
给定一个表示不可知的请求对象?

为什么不在RepsonseKind枚举(枚举实际上是类)上实现呈现,或者完全取消它?当您发现自己试图摆脱case/switch语句时,答案通常是组合+重载+命令模式或访问者模式。

ResponseKind随后会对HTTP REST产生负担,但在TCP服务器上下文中使用它时,这是没有意义的。访问者模式看起来很有趣。只需让ResponseKind实现多个接口。或者让它发出一个将处理该处理的类型的实例,减去HTTP/REST包。后者将更符合“单一关注点”。
public enum RESTPresentationKind() {
    HTML, JSON, XML, PROTOBUF_MYSERV_0.1;
}