Почему имя поля объекта изменяется на имя поля JSON, если имя последнего отличается? - PullRequest
0 голосов
/ 04 сентября 2018

Я создаю веб-приложение с java / spring на бэкэнде и угловым 2+ на фронтэнде. Я только что обнаружил что-то очень очень странное. У меня есть объект с именем AffiliateLinkDTO, который отправляется из Java-приложения в угловое приложение. При получении JSON сериализуется в AffiliateLinkDTO на стороне интерфейса. Оба класса должны быть точным зеркальным отражением друг друга. Чтобы быть здесь, приведены коды обоих классов.

AffiliateLinkDTO на стороне интерфейса:

export class AffiliateLinkDTO {
    constructor(
        public id?:number,
        public affiliateLinkUrl?: string,
        public localizedStoreFront?: string,
        public sellerShipsAbroad?:boolean){}
}

AffiliateLinkDTO на стороне сервера:

public class AffiliateLinkDTO {
    private Long id;
    private String affiliateLinkUrl;
    private LocalizedStorefront localizedStorefront;
    private boolean sellerShipsAbroad;
}

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

Когда во внешнем интерфейсе я распечатываю поле affiliateLinkDTO.localizedStoreFront экземпляра AffiliateLinkDTO, оно печатает undefined, но когда я печатаю affiliateLinkDTO.localizedStorefront (с небольшим f), оно печатает значение! Как это возможно, когда поле localizedStorefront не существует в AffiliateLinkDTO на веб-интерфейсе ??? Хотя класс AffiliateLinkDTO используется для создания экземпляра объекта, имя поля чудесным образом меняется на localizedStorefront. Кто-нибудь может дать мне объяснение, пожалуйста? Я действительно озадачен этим. Спасибо.

PS: JSON не анализируется в AffiliateLinkDTO вручную, я использую HttpClient для выполнения запроса get к бэкэнду, а JSON автоматически анализируется в AffiliateLinkDTO

РЕДАКТИРОВАТЬ: То, что я увидел, было вызвано ошибкой в ​​visual studio, я перепроверил, чтобы посмотреть, смогу ли я воспроизвести то, что видел вчера, но не смог на этот раз, я получил ошибку компилятора.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Морис, когда вы делаете httpClient.get (...) Angular НЕ проверяйте полученное вами значение. Вы получили, вы получите. Идея использования состоит в том, чтобы помочь вам при написании кода. Если вы хотите, вы можете «отобразить» ответ как

getAffiliateLinkDTO(id:number):Observable<AffiliateLinkDTO>
{
    return this.httpClient<AffiliateLinkDTO>.get(".....").pipe(
       map(res=>{
          return {
             id:res.id,
             affiliateLinkUrl:res.affiliateLinkUrl,
             LocalizedStoreFront:res.localizedStorefront,
             sellerShipsAbroad:res.sellerShipsAbroad
          }
       })
    )
}
0 голосов
/ 04 сентября 2018

Я предполагаю, что вы делаете что-то подобное для создания своего AffiliateLinkDTO экземпляра из JSON:

let dto = new AffiliateLinkDTO();
let obj = JSON.parse(receivedJson);

for(let attr in obj){
    dto[attr] = obj[attr];
}

В этом случае localizedStoreFront не определено, поскольку оно никогда не устанавливается, поскольку полученный JSON содержит только атрибут с именем localizedStorefront, а не localizedStoreFront.

У вас есть два варианта решения:

  • Изменить имя атрибута в бэкэнд-классе

или

  • Добавить охрану во время создания экземпляра на внешнем интерфейсе, чтобы присвоить значение localizedStoreFront и , а не localizedStorefront
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...