2015-06-25 3 views
1

У меня есть много сервлеты, как это:Легкий способ для заполнения поля объекта

public class DoSmthServlet extends AbstractDTOServlet<DoSmthServlet.Params> { 

    @Override 
    public Response service(Params params) throws Exception { 
     // Some logic... 

     Response response = new Response(); 
     response.field1 = data1; 
     response.field2 = data2; 
     // ... 
     return response; 
    } 

    public static class Params implements DomainDTO { 
     public long arg1; 
     public boolean arg2; 
     // ... 
    } 

    public static class Response implements DomainDTO { 
     public String field1; 
     public long field2; 
     // ... 
    } 

} 

Мне нужно, чтобы заполнить объект ответа с данными, но она может содержать очень много полей. Как это сделать, не записывая много response.fieldN = dataN в каждый сервлет? Я не хочу писать конструкторы для каждого класса, потому что мне все равно придется писать такие назначения в конструкторах.

Возможно, есть библиотека, которая может это сделать, или любой шаблон, который я могу использовать, или любой способ генерировать конструкторы для классов Response?

+1

Где вы получаете данные1, data2 и т. Д. От? –

+0

@Naman Gala Они объявлены в методе 'service'. Они являются результатом выполнения «некоторой логики» с параметрами. –

+0

Что вы хотите достичь, написав этот сервлет? Если вы хотите разработать успокоительный api, вы можете проверить другую java-apis как jax-rs. Используя jax-rs, вы можете легко сопоставить свои параметры Post или Form с объектом. – bhdrkn

ответ

1

Возможно, Dozer bean mapper может вам помочь. Некоторые примеры:

Mapper mapper = new DozerBeanMapper(); 

DestinationObject destObject = 
mapper.map(sourceObject, DestinationObject.class); 

или

DestinationObject destObject = new DestinationObject(); 
mapper.map(sourceObject, destObject); 
0

Я не знаю ни одной библиотеки, которая может сделать это для вас. Но ... вы можете использовать плавный строитель, который упростит создание и сделает это немного ... проще, я думаю.

ex.

public class ResponseBuilder { 
    private Response response = new Response(); 
    public ResponseBuilder withField1(String field1) { 
     response.field1 = field1; 
     return this; 
    } 
    public ResponseBuilder withField2(String field2) { 
     response.field2 = field2; 
     return this; 
    } 
    public Response build() { 
     return response; 
    } 
} 

// usage 
Response response = Response.builder.withField1("a").withField2("b").build(); 

BTW: Я предпочел бы не писать конструктор с большим количеством аргументов для Value объекта/класса DTO, потому что каждый аргумент, передаваемый конструктору следует рассматривать по мере необходимости.

+0

Я думал об этом. Но, насколько я понимаю, невозможно сделать один универсальный Builder для всех ответов. И писать новый Builder для каждого класса сложно. Использование многих назначений еще проще. –

+0

@VladShevchenko: Все зависит от ваших требований. Вопрос в том, хотите ли вы ввести новую зависимость (и взять еще один технический долг) или написать строителям самостоятельно, а после 2-го или 3-го - увидеть, есть ли возможность улучшения. – Arek

0

Если количество полей одинаково для всего объекта Response, то напишите один static function и позвоните ему из разных сервлетов. static function сделает все response.fieldN = dataN

+0

Нет, количество и типы полей различны для каждого ответа. –

Смежные вопросы