2013-11-14 39 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()); 
    } 
}