Spring MVC: необходимо элегантное решение для обработки и удаления строк, передаваемых во Front End - PullRequest
0 голосов
/ 24 июня 2018

Я создаю веб-приложение, используя Spring MVC.Приложение включает в себя выборку нескольких объектов, содержащих строки в качестве атрибутов из базы данных.У меня нет контроля над форматом этих строк, введенных в базу данных.

Я столкнулся с проблемой, когда строки, в которых есть кавычки ("и"), передаются в JavaScript в качестве атрибутов объектов JSON, они не распознаются как часть строки и, следовательно, закрывают кавычки.строки, частью которой они были. Я решил эту проблему, вызвав функцию JavaScriptUtils.javaScriptEscape () для каждой строки, извлеченной из базы данных в функции-оболочке.

Это исправляет ошибки JavaScript, но теперь у меня естьПроблема в том, что когда на веб-странице отображаются те же строки, включается escape-символ '\' (т. е. "отображается как \" и т. д.). Теперь мои требования следующие:

  1. ТребуетсяФункция «unescape» эти строки вернуться к нормальной форме, чтобы они работали как задумано

  2. Нужен способ применить указанную функцию ко всем строкам, извлеченным в передний конец. Это слишком многоБольно индивидуально вызывать эту функцию для каждого атрибута каждого объекта JSON, извлеченного в каждом вызове AJAX.добавленное в приложение в будущем, решение должно быть таким, которое не требует жесткого кодирования в каждом AJAX-запросе.

  3. Нужен лучший способ применить это экранирование к выбранным объектамиз базы данных.Прямо сейчас у меня есть отдельная функция, которая убирает строки в каждом объекте, но проблема в том, что мне нужно будет определять новую функцию каждый раз, когда выбирается новый тип объекта.

Интересно, есть ли способ заставить Spring MVC автоматически справиться с этим, так как кажется, что это проблема, с которой большинство разработчиков столкнется в какой-то момент.Любые предложения, которые помогут сделать это проще для меня, приветствуются!

РЕДАКТИРОВАТЬ:

Это функция, которая вызывается для каждой строки, выбранной из базы данных:

String EscapeJS(String string)
{
    string = JavaScriptUtils.javaScriptEscape(string);
    return string;
}

Вот как возвращаются объекты:

@RequestMapping(value = "/urlToController", method = RequestMethod.POST)
public ResponseEntity<Object> returnObject(@RequestBody String option)
{
    Object object = wrapperFunction(fetchObjectFromBackend(option));

    return new ResponseEntity<>(object, HttpStatus.OK);
}

Здесь 'wrapperFunction ()' преобразует все строки внутри объекта с помощью EscapeJS ()

Это вызов AJAX:

$.ajax({
        type: "POST",
        headers:
        {
            'Accept': 'application/json',
            'Content-Type': 'application/json'
        },
        url: '/urlToController',
        data: option,
        success: function(returnedObject)
        {
            console.log(returnedObject);
        },
        error : function(dataString)
        {
            alert("AJAX Call failed");
            console.log(dataString);
        }
    });

1 Ответ

0 голосов
/ 24 июня 2018

Есть несколько способов сделать экранирование строки более универсальным. Наиболее способным и продвинутым способом было бы создать пользовательский ObjectMapper, где вы могли бы обрабатывать все различные экранирования и настройки, которые вы хотите сделать. Затем, если вы зарегистрируете этот ObjectMapper в Spring, у вас будет полный контроль над тем, как генерируется json. Для Spring MVC смотрите здесь пример:

http://magicmonster.com/kb/prg/java/spring/webmvc/jackson_custom.html

А для весенней загрузки это немного проще: Настройка ObjectMapper весной

Другая опция, которая немного менее способна, но, возможно, проще, - это просто создать объект-обертку, который просто управляет выходящей из вас строкой как частью bean-компонента. Так что измени это:

Object object = wrapperFunction(fetchObjectFromBackend(option));
return new ResponseEntity<>(object, HttpStatus.OK);

Примерно так:

Object object = wrapperFunction(fetchObjectFromBackend(option));
//The wrapper would make the escape calls needed and have a single property to 
//return the escaped string for you
MyWrapper wrapped = new MyWrapper(object);
return new ResponseEntity<>(wrapped, HttpStatus.OK);

Где конструктор MyWrapper делает все, что вам нужно, с данными. Вы также можете просто вернуть экранированную строку напрямую, если хотите:

return new ResponseEntity<>(wrapped.getEscapedString(), HttpStatus.OK);

Возможно, ObjectMapper - лучший способ работать в долгосрочной перспективе, но это зависит от вашей системы и запланированных настроек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...