java - Spring REST - 从实体构建链接

标签 java spring spring-mvc jpa

我正在使用 Spring + JPA,我已经将一个实体映射为一个数据库 View ,我在其中获得了所有字段。

现在我想向这个实体添加一个字段并返回一个基于另一个字段的链接图像(所有图像都存储在资源/图像中)

@Entity
@Table(name = "Release")
public class Release implements Serializable
{
  private String user;
  private String userImageLink; // This is what i need to implement

  @XmlElement
  @JsonProperty
  public String getUser(){
    return user;
  }
  public void setUser(String user) {
    this.user = user;
  }

  public String getUserImageLink(){
    String imageUrl = /*i need to access to resource/images and create the link
                       If i run on localhost should return: http://127.0.0.1:8080/resources/images..
                       In production coudl return: http://myServer.com/resources/images..     
                      */;
    return imageUrl;
  }
}
}

问题是:我如何创建和返回这个 url?

更多信息

如果表有 3 个条目:User1、User2、User3

在 userImageLink 中我应该返回:

http://myserver.com/resources/images/User1.jpg http://myserver.com/resources/images/User2.jpg

图像是否存在于资源/图像中并不重要,当我访问从我的“发布”@Entity 获取数据的服务时,我只需要将 url 作为附加参数组成

最佳答案

您可以使用应用程序 ServletContext 生成图像的 URL。 此 ServletContext 不能作为 POJO 访问到您的 JPA 实体中,但应作为 bean 注入(inject)到 Spring 容器中,否则您将得到一个 null 引用:

  • 在您的实体中将静态实例变量 Autowiring 为 ServletContext:
@Entity
@Table(name = "Release")
public class Release implements Serializable
{
  @Transient
  private static ServletContext servletContext;

  @PostConstruct
  public void init() {
    log.info("Initializing ServletContext as [" +
                Release.servletContext + "]"); //Forces injection after bean construction.
  }

  @Autowired
  public void setServletContext(ServletContext servletContext) {
    Release.servletContext = servletContext; //Note the use of class name because that fiels hould be static thus shared by all instances.
  }
  //...
}
  • 使用注入(inject)的 ServletContext 检索您的 webapp 上下文路径并相应地构建您的图像 URL:
@Entity
@Table(name = "Release")
public class Release implements Serializable
{
  //...
  public String getUserImageLink(){
    StringBuilder imageUrlBuilder = new StringBuilder(Release.servletContext.getContextPath())
        .append("/resources/images")
        .append(this.user);
    return imageUrlBuilder.toString();
  }
}

请记住添加基于注释的 bean scannig 以识别您的 servlet 上下文 bean 并使用 @Component 标记您的 Release 类以便它被扫描:

<beans>
  <!-- ... -->
  <context:component-scan base-package="package.of.Release" />
<beans>

感谢@Ravi Thapliyal sharing the tip .

关于java - Spring REST - 从实体构建链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25721400/

相关文章:

java - 如何在Camel 3.x中获取RouteDefinition(从2.x迁移到3.x)

java - 使用 Java Mail API 从 eml 文件读取附件时出错

java - Spring MVC - 未找到 HTTP 请求的映射

java - Spring JMX 集成问题

java - Spring Boot - 出现意外错误(类型=错误请求,状态=400)。缺少必需的请求正文

java - Spring MVC Controller 中的授权方法

java - 我应该使用什么设计模式?使用 Spring 框架

java - 在验证 XAdES-T 消息之前,如何从 X509SubjectName 中删除属性 PSEUDONYM

java - 我可以在删除查询中使用 SET LOCK_TIMEOUT 吗?

Java从列表中获取特定值并添加到其他列表