Service Builder - это мощный инструмент в составе Liferay Portal, позволяющий разработчикам хранить в базе портала произвольные данные, описывать новые сущности и создавать сервисы для доступа (в том числе, и удалённого) к этим данным. Тема разработки сервисов для Liferay слишком обширна, чтобы её можно было рассмотреть в одной заметке, поэтому сегодня я остановлюсь на решении одной частной проблемы, связанной с заданием нужной длины для текстовых полей, и, в частности, создания полей неограниченной длины (тип "text" в БД).
В основном конфигурационном файле Service Builder, service.xml, длина текстовых полей не регламентируется никак - там задаётся тип данных Java, а он, независимо от длины, у всех строк будет String:
Если всё оставить "как есть", то, например, в случае использования PostgreSQL, мы получим все текстовые поля типа varchar длиной 75 символов, чего во многих случаях явно будет недостаточно:
Несложное гугление позволяет найти решение - чтобы изменить длину поля, надо модифицировать файл src/META-INF/portlet-model-hints.xml:
Проверяем - длина полей, действительно, изменилась:
Резонный вопрос - а как тогда сделать поле неограниченной длины? Проведём эксперимент - выставим в portlet-model-hints.xml в качестве его длины какое-нибудь очень большое число:
Проверяем базу, и видим очень сильное колдунство:
Гуглим ещё раз, и узнаём, что никакой уличной магии тут нет - оказывается, на Service Builder, действительно, удивительным образом влияют большие числа, только не 9000 (как можно было бы предположить), а 4000 - все поля с длиной до 4000 символов Service Builder пытается транслировать в varchar, а начиная с 4001 символа - в text.
Таким образом, проблема решена - чтобы наше поле стало неограниченной длины, нужно задать ему в portlet-model-hints.xml длину в 4001 символ или больше.