Используйте @JsonProperty для отображения выходной строки с DTO исключая:
@JsonProperty ("authorizationToken") частная Строка authToken;
и продолжают использовать объекты в ResponseEntity вместо Строки
ResponseEntity<SecurityToken> responseEntity = new RestTemplate().postForEntity(
endpoint,
credentials,
SecurityToken.class
);
С Языка Программирования на C++ 20.3.7 (шахта акцента):
Преобразование в строку C-стиля, возможно, было обеспечено символом константы оператора* (), а не c_str (). Это обеспечило бы удобство неявного преобразования за счет неожиданностей в случаях, в которых такое преобразование было неожиданно .
Я вижу по крайней мере две проблемы с неявным преобразованием:
Даже явное преобразование, которое c_str()
обеспечивает, достаточно опасно, как. Я видел много случаев, где указатель был сохранен, чтобы использоваться после того, как время жизни объекта исходной строки закончилось (или объект был изменен, таким образом делая недействительным указатель). С явным вызовом к c_str()
Вы, надо надеяться, знаете об этих проблемах. Но с неявным преобразованием было бы очень легко вызвать неопределенное поведение как в:
const char *filename = string("/tmp/") + name;
ofstream tmpfile(filename); // UB
преобразование также произошло бы в некоторых случаях, где Вы не будете ожидать, что это и семантика удивительно по меньшей мере:
string name;
if (name) // always true
;
name-2; // pointer arithmetic + UB
Их могли избежать некоторые средства, но почему входят в эту проблему во-первых? В книге Josuttis говорится следующее:
Это из соображений безопасности предотвратить непреднамеренные преобразования типов, которые приводят к странному поведению (тип
char *
часто имеет странное поведение) и неоднозначности (например, в выражении, которое объединяетсяstring
и струна до, которую было бы возможно преобразоватьstring
вchar *
и наоборот).
Поскольку неявные преобразования почти никогда не ведут себя, как Вы ожидаете. Они могут дать неожиданные результаты в разрешении перегрузки, таким образом, это обычно лучше для обеспечения явного преобразования как станд.:: строка делает.
Я дополнение к объяснению, обеспеченному в спецификации (неожиданные неожиданности), если Вы смешиваете вызовы API C со станд.:: строка, действительно необходимо выработать привычку использования:: c_ctr () метод. Если Вы когда-нибудь вызываете varargs функцию (например: printf, или эквивалентный), который требует символа константы*, и Вы передаете станд.:: представьте в виде строки непосредственно (не называя метод извлечения), Вы не получите ошибку компиляции (никакая проверка типа функции varargs), но Вы получите ошибку периода выполнения (расположение класса не двоичное идентичный символу константы*).
Кстати, CString (в MFC) проявляет противоположный подход: это имеет неявный бросок, и расположение класса совместимо с двоичным файлом с символом константы* (или константа w_char*, при компиляции для строк широкого символа, т.е.: "Unicode").
Это, вероятно, потому что это преобразование имело бы удивление и специфическую семантику. Особенно, четвертый абзац Вы заключаете в кавычки.
Другая причина состоит в том, что существует неявное преобразование const char* -> string
, и это было бы просто обратным, которое будет означать странное поведение wrt разрешение перегрузки (Вы не должны делать и неявные преобразования A->B
и B->A
).
Поскольку строки C-стиля являются источником ошибок и многих проблем безопасности, это - путь лучше для создания преобразования явно.