我正在构建一个Webapp,在后端使用java / spring,在前端使用angular 2+。我刚刚发现了一些非常非常奇怪的东西。我有一个名为AffiliateLinkDTO
的对象,它从Java应用程序发送到Angle应用程序。收到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;
}
正如您所看到的,两者都是彼此的精确图像,只是细节有所不同,后端上localizedStorefront的F不像前端上的对应大写。奇怪的是,这不会导致正面错误,但会变得更奇怪。
当在前端我打印出affiliateLinkDTO.localizedStoreFront
实例的字段AffiliateLinkDTO
时,它打印出undefined
,但是当我打印出affiliateLinkDTO.localizedStorefront
(带有小f)时,它打印值了!当前端的AffiliateLinkDTO上不存在localizedStorefront字段时,怎么办?即使使用类AffiliateLinkDTO实例化该对象,该字段名也会奇迹般地更改为localizedStorefront
。谁能给我一个解释?我对此感到非常困惑。谢谢。
PS:JSON不会手动解析为AffiliateLinkDTO,我正在使用HttpClient向后端发出get请求,并且JSON自动解析为AffiliateLinkDTO
编辑:我看到的是Visual Studio中的错误引起的,我重新检查是否可以重现昨天看到的内容,但是这次却无法编译。
答案 0 :(得分:0)
我假设您正在执行类似的操作以从JSON创建AffiliateLinkDTO
实例:
let dto = new AffiliateLinkDTO();
let obj = JSON.parse(receivedJson);
for(let attr in obj){
dto[attr] = obj[attr];
}
在那种情况下,localizedStoreFront
是未定义的,因为它从未设置,因为接收的JSON仅包含一个名为localizedStorefront
的属性,而不包含localizedStoreFront
。
您可以通过以下两种方法解决此问题:
或
localizedStoreFront
,将不分配给localizedStorefront
答案 1 :(得分:0)
莫里斯(Maurice),当您创建httpClient.get <接口>(...)角度时不检查收到的值。您收到了。使用
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
}
})
)
}