2013-11-14 4 views
0

У меня есть метод writeResponse внутри контроллера Spring, который записывает 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 должен быть записан, существует параметр метода типа. Таким образом, вышеуказанный метод может стать следующим:

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

Взгляните на [этот учебник: проектирование и внедрение веб-служб RESTful с помощью Spring] (http://spring.io/guides/tutorials/rest/). В частности, @RequestMapping аннотация. –

ответ

1

Поскольку у вас есть отдельные URL, каждый из которых оказывают различное содержание 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()); 
    } 
} 
Смежные вопросы