我应该在哪里定义实体的自定义方法?

时间:2019-03-29 09:56:55

标签: java spring-boot jsp

我创建了一个实体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中的最佳实践是什么?

1 个答案:

答案 0 :(得分:0)

我发现本教程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的有用提示。