【问题标题】:Where should I define custom methods for entities?我应该在哪里为实体定义自定义方法?
【发布时间】:2019-03-29 09:56:55
【问题描述】:

我创建了一个实体Post,它有一个属性body,这个属性存储markdown(文本),我想将body转换成html(并在jsp视图中呈现)所以我添加了一个实例方法到实体:

@Entity
@Table(name = "posts")
public class Post {
  @NotBlank
  private String body

  // ... getters/setters

  public String bodyToHtml() {
    Parser parser = Parser.builder().build();
    Node document = parser.parse(StringEscapeUtils.escapeHtml4(body));
    HtmlRenderer renderer = HtmlRenderer.builder().build();

    return renderer.render(document);
  }
}

JSP:

<c:forEach var="post" items="${posts}">
  <div class="post-body">
    ${post.bodyToHtml()}
  </div>
  <hr>
</c:forEach>

我想知道定义这样的方法是否正确?用于此类目的的 java/spring 中的最佳实践是什么?

【问题讨论】:

  • 这不是一个好的设计。我将为 Post 创建一个 DTO 对象和一个服务方法,其中完成从实体到 DTO 的映射(=html 渲染)。
  • 感谢@DerM 的提示,我会看看我能做什么。

标签: java spring-boot jsp


【解决方案1】:

我发现本教程 https://www.baeldung.com/entity-to-and-from-dto-for-a-java-spring-application 所以最终得到了 DTO 类 PostDTO,它具有与原始 Post 和服务 PostService 相同的所有属性:

@Service
public class PostService {
  private static final Parser parser = Parser.builder().build();
  private static final HtmlRenderer htmlRenderer = HtmlRenderer.builder().build();

  @Autowired
  ModelMapper modelMapper;

  @Autowired
  PostRepository postRepository;

  public List<PostDTO> getPostsList(int page, int pageSize) {
    Page<Post> posts = postRepository.findAll(
      PageRequest.of(page <= 0 ? 0 : page - 1, pageSize, new Sort(Direction.DESC, "createdAt"))
    );

    return posts.getContent()
      .stream()
      .map(post -> postToDTO(post))
      .collect(Collectors.toList());
  }

  private PostDTO postToDTO(Post post) {
    PostDTO dto = modelMapper.map(post, PostDTO.class);
    Node document = parser.parse(StringEscapeUtils.escapeHtml4(post.getBody()));

    dto.setBody(htmlRenderer.render(document));
    return dto;
  }
}

看起来好多了,感谢@DerM 的有用提示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 2014-08-14
    • 1970-01-01
    • 2017-01-20
    相关资源
    最近更新 更多