2015-06-06 5 views
4

Привет, Я ищу решение/плагин в Eclipse, чтобы сохранить свойства Java DTO на стороне сервера и их коллеги JSON на стороне клиента, согласованные на протяжении всей эволюции кодовой базы , Например, для веб-приложение с серверной Java, с API, открытых через интерфейс REST (используя Jackson), веб-приложение может иметь что-то вроде этого на сервере:Как сохранить совместимость с JS DTO на стороне сервера на стороне Java и на стороне клиента

DTO:

public class Person { 
    private String firstName; 
    private String lastName; 
    public Person(String string, String string2) { 
     firstName = string; lastName = string2; 
    } 
    public String getFirstName() { 
     return firstName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
    public String getLastName() { 
     return lastName; 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
} 

The Rest Услуги:

@Path("/data") 
public class PersonService { 
    @GET 
    @Path("persons") 
    @Produces(MediaType.APPLICATION_JSON) 
    public List<Person> getAssets() { 
     List<Person> persons = new ArrayList<Person>(); 
     persons.add(new Person("Jimmy", "Hendrix")); 
     persons.add(new Person("Roger", "Waters")); 
     return persons; 
    } 
} 

на стороне клиента в JavaScript/JQuery, мы можем иметь такой код:

$.ajax('/data/persons/', function(data){ for(var i = 0; i < data.length; i++){ var firstName = data[i].firstName; var lastName = data[i].lastName; //do some stuff to populate the view with the person data } });

Все это легко настроить. Однако, поскольку кодовая база развивается и изменяется (как это всегда бывает), предположим, что необходимо изменить имена полей DTO из «firstName» и «lastName», «foreName» и «surName».

В Eclipse рефакторинг всего кода Java прост, используя пункт меню Refactor, который найдет ВСЕ ссылки метода/поля в Java-коде и заменит их. Обратите внимание, что «Refactor ...» Eclipse отличается от действия Find/Replace. Find/Replace заменяет основной текст на все указанные файлы. С другой стороны, Refactor учитывает, что Java является строго типизированным языком программирования и ищет все вызовы методов с этой сигнатурой.

Было бы здорово, если бы была какая-то функция плагина или Eclipse, которая была бы достаточно умна, чтобы изменить ссылку на «firstName» и «lastName» в коде Javascript. Это сэкономит разработчикам время, необходимое для выполнения Refactor только для кода Java, а затем выборочного поиска/замены в коде Javascript и сокращения потенциальных ошибок времени выполнения. Кто-нибудь знает, существует ли такой инструмент/плагин?

ответ

0

Нет такого плагина. Добро пожаловать в мир языков, которые не статически типизированы.

1

Да, меня тоже. Это похоже на образец, с которым я сталкиваюсь на каждой работе.

Лучшее, что я делал в прошлом, - это генерировать Javascript-заглушки из JTO-DTO и использовать JsDoc, чтобы указать, где используются эти Javascript-DTO.

Если бы я сегодня принимал то же самое решение, я бы, наверное, увидел, что Swagger codegen выдаст мне из коробки.

Intellij по крайней мере выделит отсутствующие поля в javascript, что полезно.

Было бы здорово, если бы был плагин, но это было лучше, чем ничего.

С машинописью вы даже получите безопасность компиляции с заглушками.

1

Для фрагмента JavaScript, который вы представили в вопросе, такой инструмент, вероятно, невозможно записать.

Однако есть вещи, которые вы можете сделать, чтобы улучшить ситуацию.

С одной стороны, вы можете написать генератор для JavaScript-представлений ваших DTO. Стратегия, ориентированная на IDE, заключается в создании объектов со свойствами со значениями по умолчанию.Как

var Person = { firstName: "", lastName: "", roles:[] }; 

Даже если вы не активно интегрировать такой файл в реальный веб-интерфейс, это помогает уменьшить ошибки опечатки, проверяя предупреждения IDE будет бросить на вас.

С другой стороны, вы можете/должны использовать реальный слой модели JavaScript. Затем вы можете проверить все представления JavaScript DTO во время автоматического тестирования и/или с помощью специальной кнопки, например. поддерживающей часть пользовательского интерфейса, которую QA всегда проверяет перед выпуском. Если вы обновите свой веб-интерфейс вместе с сервером, он определенно поможет поймать пропущенные остатки рефакторинга.

проверки конечных точек будет получить объект JSON как это:

{ "Person": {...}, "Address": {...}, "Item": {...}, ... } 

и запустить его на пакет (ы) с использованием DTOS немного Java отражения. Разумеется, вы также можете использовать движок Nashorn на Java для выполнения проверки непосредственно на сервере, например. во время запуска сервера.

Это не серебряная пуля, она просто помогает уменьшить ошибки. В конце концов, чем меньше неясной логики вы используете в пользовательском интерфейсе, тем легче делать рефакторинг. Создавайте или используйте общие универсальные компоненты, проводя их до DTO в очень тонком слое перевода, который использует таблицы поиска меток, которые также могут быть проверены. Также помогает с i18n.

Генерация и проверка могут использоваться отдельно или вместе в одном проекте.

Кстати, одной из причин выбора GWT для слоя пользовательского интерфейса несколько лет назад было достижение именно того, что вы хотите. Я не преследовал его некоторое время, но было бы трудно представить, что его недостатки перевесят эту выгоду.