Java Spring 不 return DTO 对象如果为空?
Java Spring don't return DTO objects if null?
我有一个 Java 实现覆盖方法,根据输入的参数,returns DTO 对象来自 2 个微服务。
我能够获得经过过滤的搜索结果,但是在不满足第二个服务条件的情况下,我收到 'null' 我想获得一个结果,其中空对象不是 returned whatsoever.How 我能到 return 满足所有指定参数的结果?
下面我提供了我使用 "Swagger" 收到的响应的屏幕截图以及执行所有操作的代码片段。
我是否需要使用 ObjectMapper 或类似 @JsonInclude(Include.NON_NULL)
的东西,但是我可以在服务植入和 DTO 对象中使用它吗?
如有任何进一步的建议或想法,我们将不胜感激。
我进一步完善了我之前的问题
招摇响应
代码段
@Override
public Page<ProfileCreditDTO> findProfileBySelectedParameters(String username, Integer gender, Integer profileType, Integer orientation, Boolean online, Double profileCredit, Integer creditMode, Double creditTotal, Pageable pageable) {
Page<Profile> searchData= profileRepository.findByAllParameters(username, gender, profileType, orientation, online, pageable);
Page<ProfileCreditDTO> searchProfileData=null;
if(searchData != null)
searchProfileData = searchData.map(x -> this.convertProfileToProfileCreditDTO(x, profileCredit, creditMode, creditTotal));
return searchProfileData;
}
public ProfileCreditDTO convertProfileToProfileCreditDTO(final Profile theProfile, Double profileCredit, Integer creditMode, Double creditTotal) {
if(theProfile == null)
return null;
ProfileCreditDTO theDTO= new ProfileCreditDTO();
theDTO.setProfile(theProfile);
CreditDTO theCreditDto = profileCreditClient.findClientByProfileId(theProfile.getId(), profileCredit, creditMode, creditTotal);
log.error(String.valueOf(theCreditDto));
if (theCreditDto != null)
theDTO.setCredit(theCreditDto);
else {
return null;
}
return theDTO;
}
已更新
我已经尝试将 @JsonInclude(Include.NON_NULL)
添加到 ProfileCredit DTO 中仍然没有,也已将相同的内容添加到 CreditDTO 中。
ProfileCredit DTO
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ProfileCreditDTO {
// profile fields
private Long profileId;
@Size(min = 2, max = 50)
private String username;
private Integer gender;
private Integer profileType;
private Integer orientation;
private boolean online;
// Credit fields
private Long creditId;
@Column(unique = true)
private Double profileCredit; //X
private Integer creditMode;
private Integer creditCheck;
private Double creditTotal;
/**
* set the profile derrived data
* @param profile
*/
public void setProfile(final Profile profile){
this.setProfileId(profile.getId());
this.setUsername(profile.getUsername());
this.setGender(profile.getGender());
this.setProfileType(profile.getProfileType());
this.setOrientation(profile.getOrientation());
this.setOnline(profile.isOnline());
}
/**
* Set the credit aspect
* @param credit
*/
public void setCredit(final CreditDTO credit){
this.setCreditId(credit.getId());
this.setProfileId(credit.getProfileId());
this.setProfileCredit(credit.getProfileCredit());
this.setCreditMode(credit.getCreditMode());
this.setCreditTotal(credit.getCreditTotal());
}
当我在实现中未指定 return null;
时,响应如下所示。如您所见,所有满足条件 1 的对象都得到 returned,但不满足条件 2 的空对象字段被 returned。
您的 "objects" 元素不能直接从页面中删除。你可以做的是,从页面中获取内容,这将是一个列表,然后根据你的条件从列表中删除元素,然后创建一个新页面,其中包含页面所需的数据字段。
而不是
@Override
public Page<ProfileCreditDTO> findProfileBySelectedParameters(String username, Integer gender, Integer profileType, Integer orientation, Boolean online, Double profileCredit, Integer creditMode, Double creditTotal, Pageable pageable) {
Page<Profile> searchData= profileRepository.findByAllParameters(username, gender, profileType, orientation, online, pageable);
Page<ProfileCreditDTO> searchProfileData=null;
if(searchData != null)
searchProfileData = searchData.map(x -> this.convertProfileToProfileCreditDTO(x, profileCredit, creditMode, creditTotal));
return searchProfileData;
}
尝试
@Override
public Page<ProfileCreditDTO> findProfileBySelectedParameters(String username, Integer gender, Integer profileType, Integer orientation, Boolean online, Double profileCredit, Integer creditMode, Double creditTotal, Pageable pageable) {
Page<Profile> searchData= profileRepository.findByAllParameters(username, gender, profileType, orientation, online, pageable);
Page<ProfileCreditDTO> searchProfileData=null;
if(searchData != null)
searchProfileData = searchData.map(x -> this.convertProfileToProfileCreditDTO(x, profileCredit, creditMode, creditTotal));
List modifiedAppList = searchProfileData.getContent().stream().filter(v -> v !=null).collect(Collectors.toList()); //Will filter your search result and put it into a list
Page<ProfileCreditDTO> filteredList = new PageImpl<>(modifiedAppList, new PageRequest(0, searchProfileData.getSize()), searchProfileData.getTotalElements()); //Will put your filtered list back into page
return filteredList; //Returns filtered result
}
从 Spring Data Rest - How to remove an element from a Page? 得到了这个问题的答案只是修改了代码和措辞的一点,因为答案已经在现场;)
添加这个
@JsonInclude(JsonInclude.Include.NON_NULL)
我有一个 Java 实现覆盖方法,根据输入的参数,returns DTO 对象来自 2 个微服务。
我能够获得经过过滤的搜索结果,但是在不满足第二个服务条件的情况下,我收到 'null' 我想获得一个结果,其中空对象不是 returned whatsoever.How 我能到 return 满足所有指定参数的结果?
下面我提供了我使用 "Swagger" 收到的响应的屏幕截图以及执行所有操作的代码片段。
我是否需要使用 ObjectMapper 或类似 @JsonInclude(Include.NON_NULL)
的东西,但是我可以在服务植入和 DTO 对象中使用它吗?
如有任何进一步的建议或想法,我们将不胜感激。
我进一步完善了我之前的问题
招摇响应
代码段
@Override
public Page<ProfileCreditDTO> findProfileBySelectedParameters(String username, Integer gender, Integer profileType, Integer orientation, Boolean online, Double profileCredit, Integer creditMode, Double creditTotal, Pageable pageable) {
Page<Profile> searchData= profileRepository.findByAllParameters(username, gender, profileType, orientation, online, pageable);
Page<ProfileCreditDTO> searchProfileData=null;
if(searchData != null)
searchProfileData = searchData.map(x -> this.convertProfileToProfileCreditDTO(x, profileCredit, creditMode, creditTotal));
return searchProfileData;
}
public ProfileCreditDTO convertProfileToProfileCreditDTO(final Profile theProfile, Double profileCredit, Integer creditMode, Double creditTotal) {
if(theProfile == null)
return null;
ProfileCreditDTO theDTO= new ProfileCreditDTO();
theDTO.setProfile(theProfile);
CreditDTO theCreditDto = profileCreditClient.findClientByProfileId(theProfile.getId(), profileCredit, creditMode, creditTotal);
log.error(String.valueOf(theCreditDto));
if (theCreditDto != null)
theDTO.setCredit(theCreditDto);
else {
return null;
}
return theDTO;
}
已更新
我已经尝试将 @JsonInclude(Include.NON_NULL)
添加到 ProfileCredit DTO 中仍然没有,也已将相同的内容添加到 CreditDTO 中。
ProfileCredit DTO
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ProfileCreditDTO {
// profile fields
private Long profileId;
@Size(min = 2, max = 50)
private String username;
private Integer gender;
private Integer profileType;
private Integer orientation;
private boolean online;
// Credit fields
private Long creditId;
@Column(unique = true)
private Double profileCredit; //X
private Integer creditMode;
private Integer creditCheck;
private Double creditTotal;
/**
* set the profile derrived data
* @param profile
*/
public void setProfile(final Profile profile){
this.setProfileId(profile.getId());
this.setUsername(profile.getUsername());
this.setGender(profile.getGender());
this.setProfileType(profile.getProfileType());
this.setOrientation(profile.getOrientation());
this.setOnline(profile.isOnline());
}
/**
* Set the credit aspect
* @param credit
*/
public void setCredit(final CreditDTO credit){
this.setCreditId(credit.getId());
this.setProfileId(credit.getProfileId());
this.setProfileCredit(credit.getProfileCredit());
this.setCreditMode(credit.getCreditMode());
this.setCreditTotal(credit.getCreditTotal());
}
当我在实现中未指定 return null;
时,响应如下所示。如您所见,所有满足条件 1 的对象都得到 returned,但不满足条件 2 的空对象字段被 returned。
您的 "objects" 元素不能直接从页面中删除。你可以做的是,从页面中获取内容,这将是一个列表,然后根据你的条件从列表中删除元素,然后创建一个新页面,其中包含页面所需的数据字段。
而不是
@Override
public Page<ProfileCreditDTO> findProfileBySelectedParameters(String username, Integer gender, Integer profileType, Integer orientation, Boolean online, Double profileCredit, Integer creditMode, Double creditTotal, Pageable pageable) {
Page<Profile> searchData= profileRepository.findByAllParameters(username, gender, profileType, orientation, online, pageable);
Page<ProfileCreditDTO> searchProfileData=null;
if(searchData != null)
searchProfileData = searchData.map(x -> this.convertProfileToProfileCreditDTO(x, profileCredit, creditMode, creditTotal));
return searchProfileData;
}
尝试
@Override
public Page<ProfileCreditDTO> findProfileBySelectedParameters(String username, Integer gender, Integer profileType, Integer orientation, Boolean online, Double profileCredit, Integer creditMode, Double creditTotal, Pageable pageable) {
Page<Profile> searchData= profileRepository.findByAllParameters(username, gender, profileType, orientation, online, pageable);
Page<ProfileCreditDTO> searchProfileData=null;
if(searchData != null)
searchProfileData = searchData.map(x -> this.convertProfileToProfileCreditDTO(x, profileCredit, creditMode, creditTotal));
List modifiedAppList = searchProfileData.getContent().stream().filter(v -> v !=null).collect(Collectors.toList()); //Will filter your search result and put it into a list
Page<ProfileCreditDTO> filteredList = new PageImpl<>(modifiedAppList, new PageRequest(0, searchProfileData.getSize()), searchProfileData.getTotalElements()); //Will put your filtered list back into page
return filteredList; //Returns filtered result
}
从 Spring Data Rest - How to remove an element from a Page? 得到了这个问题的答案只是修改了代码和措辞的一点,因为答案已经在现场;)
添加这个
@JsonInclude(JsonInclude.Include.NON_NULL)