当我传递 json 对象时,它使用 DTO 在 mongodb 中存储空值

Posted

技术标签:

【中文标题】当我传递 json 对象时,它使用 DTO 在 mongodb 中存储空值【英文标题】:when i pass json object it store null values in mongodb using DTO 【发布时间】:2016-04-19 12:36:17 【问题描述】:

访问链接https://github.com/ashishklae/postjob

当我发布 Json 对象时,它会将所有空值存储在 mongodb 中,但是当我更新它时,它可以工作,我使用的是 DTO 模式,我认为我在我的 postjob 服务实现中的 create 方法是错误的,缺少一些逻辑,请帮助。

postjobservice实现代码

package postjob.model;

import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import static java.util.stream.Collectors.toList;

@Service
public class PostJobServiceImp  implements PostJobService 

@Autowired
private final PostJobRepository repository;

@Autowired
 public PostJobServiceImp(PostJobRepository repository) 
   this.repository = repository;


@Override
public PostJobDTO create(PostJobDTO pj) 

  PostJob postj = new PostJob();
  repository.save(postj);
 return convertToDTO(postj);




@Override
public PostJobDTO update(PostJobDTO UID) 
    PostJob updated = findpostJobById(UID.getId());
    updated.update(UID.getUserid(), UID.getSummary(),UID.getCategory(),UID.getSubCategory(),UID.getState(), UID.getPrivate(), UID.getBudget(),UID.getCity(),UID.getDuration(),UID.getINR(), UID.getReferenceDocs(), UID.getStatus(), UID.getDateTimeOfPost(), UID.getDescription(), UID.getLocation());
    updated = repository.save(updated);
    return convertToDTO(updated);
 

 @Override
 public List<PostJobDTO> findAll() 
    List<PostJob> postJobEntries = repository.findAll();
    return convertToDTOs(postJobEntries);
 

  private List<PostJobDTO> convertToDTOs(List<PostJob> models) 
        return models.stream()
                .map(this::convertToDTO)
                .collect(toList());
    

  @Override
    public PostJobDTO findById(String id) 
        PostJob job = findpostJobById(id);
        return convertToDTO(job);
    

 private PostJob findpostJobById(String id) 
    Optional<PostJob> result = repository.findOne(id);
    return result.orElseThrow(() -> new  PostJobNotFoundException(id));
 


  private PostJobDTO convertToDTO(PostJob model) 
     PostJobDTO dto = new PostJobDTO();

        dto.setUserid(model.getUserid());
        dto.setSummary(model.getSummary());
        dto.setCategory(model.getCategory());
        dto.setSubCategory(model.getSubCategory());
        dto.setDescription(model.getDescription());
        dto.setReferenceDocs(model.getReferenceDocs());
        dto.setBudget(model.getBudget());
        dto.setINR(model.getINR());
        dto.setLocation(model.getLocation());
        dto.setCity(model.getCity());
        dto.setState(model.getState());
        dto.setDuration(model.getDuration());
        dto.setDateTimeOfPost(model.getDateTimeOfPost());
        dto.setStatus(model.getStatus());
        dto.setPrivate(model.getPrivate());

        return dto;
     
     

【问题讨论】:

【参考方案1】:

这是你的方法:

@Override
public PostJobDTO create(PostJobDTO pj) 

  PostJob postj = new PostJob();
  repository.save(postj);
  return convertToDTO(postj);

我认为您想将传递的 PostJobDTO pj 存储在您的数据库中,不是吗?

但是你要做的是:你完全忽略pj,并创建一个新的(空的)PostJob 并保存这个。

解决方案:

为 PostJob 创建一个复制构造函数,它接受一个 PostJobDTO 并将 dto 的值设置为他自己的字段。

=>

@Override
public PostJobDTO create(PostJobDTO pj) 

  PostJob postj = repository.save(new PostJob(pj));
  return convertToDTO(postj);

您也可以通过PostJob convertToEnity(PostJobDTO pj) 进行操作。

=>

@Override
public PostJobDTO create(PostJobDTO pj) 

  PostJob postj = repository.save(convertToEntity(pj));
  return convertToDTO(postj);

【讨论】:

是的,想将传递的 PostJobDTO pj 存储在您的数据库中, 如果提供的答案符合您的需求,请接受它;)如果不让我现在缺少什么 我为 PostJob 创建了一个复制构造函数,它采用 PostJobDTO。 但是如何将 dto 的值设置为他自己的字段? 我分叉了你的仓库并创建了一个拉取请求。只需合并它

以上是关于当我传递 json 对象时,它使用 DTO 在 mongodb 中存储空值的主要内容,如果未能解决你的问题,请参考以下文章

当我将 JSON 对象架构传递给客户端时,它看起来不同

依赖注入 - 与数据传输对象 (DTO) 一起使用?

使用 gwt dto 时如何避免使用异步类?

Springboot接口多个DTO入参的Postman上传方式

可选地传递模型以查看

DTO(领域数据传输对象)是做什么的