2013-11-14 36 views
0

我具有弹簧控制器内的writeResponse方法,其写入DTO为JSON返回不同JSON对象:从不同的请求

private void writeResponse(String type , Object objectToWrite , ResourceResponse response){ 
    try { 

     MyDTO myDto= new MyDTO(); 

     ObjectMapper mapper = new ObjectMapper(); 
     response.getWriter().write(mapper.writeValueAsString(myDto)); 

    } 
    catch (final JsonGenerationException e) { 
     log.error(e.getMessage()); 
    } catch (final JsonMappingException e) { 
     log.error(e.getMessage()); 
    } catch (final IOException e) { 
     log.error(e.getMessage()); 
    } 
} 

方法writeResponse通过多种方法和每个呼叫者方法称为是一个不同的REST端点。 目前只有一种DTO类型:MyDTO。但是会增加更多的DTO类型。为了确定应该写哪个DTO,有一个'type'方法参数。所以上面的方法可能会变成:

private void writeResponse(String type , Object objectToWrite , ResourceResponse response){ 
      try { 

if(type == "1"){ 
       MyDTO myDto= new MyDTO(); 

       ObjectMapper mapper = new ObjectMapper(); 
       response.getWriter().write(mapper.writeValueAsString(myDto)); 
} 
else if(type == "2") 
{ 
       MyDTO2 myDto2= new MyDTO2(); 

       ObjectMapper mapper = new ObjectMapper(); 
       response.getWriter().write(mapper.writeValueAsString(myDto2)); 
} 

      } 
      catch (final JsonGenerationException e) { 
       log.error(e.getMessage()); 
      } catch (final JsonMappingException e) { 
       log.error(e.getMessage()); 
      } catch (final IOException e) { 
       log.error(e.getMessage()); 
      } 
     } 

这感觉有点笨重。我试图实现一个干净的方法返回不同的JSON取决于哪个端点被调用。有没有比我建议的更好的方法?

注意:上面的代码是伪代码和java的混合。

+0

什么是'ResourceResponse'?这种方法在哪里存在?在一个服务,控制器,其他? –

+0

看看[本教程:使用Spring设计和实现RESTful Web服务](http://spring.io/guides/tutorials/rest/)。特别是@RequestMapping注释。 –

回答

1

既然你有独立的网址,其中的每一个呈现不同的JSON的内容,这听起来像在这里很常见的唯一代码

ObjectMapper mapper = new ObjectMapper(); 
response.getWriter().write(mapper.writeValueAsString(myDto)); 

也许这就是所有的writeResponse应该做的。将其更改为类似于

private void writeResponse(Object objectToWrite , ResourceResponse response){ 
     try { 

      ObjectMapper mapper = new ObjectMapper(); 
      response.getWriter().write(mapper.writeValueAsString(objectToWrite)); 
     } 
     catch (final JsonGenerationException e) { 
      log.error(e.getMessage()); 
     } catch (final JsonMappingException e) { 
      log.error(e.getMessage()); 
     } catch (final IOException e) { 
      log.error(e.getMessage()); 
     } 
    } 

并让调用者决定要创建哪个DTO。如果你想抽象出选择哪个DTO创建的逻辑,那么你可以用一个单独的方法来做到这一点。那时你的控制者就是委托给这两种方法。

0

你可以创建一个接口:

public interface HasDto { 
    Object getDto(); 
} 

一个给定的对象类将实施getDto这样的:

@Override 
public Object getDto() { 
    return new Dto1() 
} 

而且在你接受一个HasDto对象writeResponse方法是这样的:

private void writeResponse(HasDto hasDto , ResourceResponse response) { 
    try { 
     ObjectMapper mapper = new ObjectMapper(); 
     response.getWriter().write(mapper.writeValueAsString(hasDto.getDto())); 
    } 
    catch (final JsonGenerationException e) { 
     log.error(e.getMessage()); 
    } catch (final JsonMappingException e) { 
     log.error(e.getMessage()); 
    } catch (final IOException e) { 
     log.error(e.getMessage()); 
    } 
}