【问题标题】:Spring REST - Construct link from EntitySpring REST - 从实体构造链接
【发布时间】:2014-11-01 12:05:48
【问题描述】:

我正在使用 Spring + JPA,我已经将一个实体映射为一个数据库视图,在那里我得到了所有字段。

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

@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 作为附加参数编写强>

【问题讨论】:

  • URL 指向什么?您最好从您的数据库中提供资源,因为您无法创建指向数据库记录的链接。
  • @Mistre83:如果我正确理解您的问题,您想为每个用户个人资料图像构建链接
  • @VipulParalikar:是的,您理解正确。我已经用更多细节更新了我的答案,但是是的......我想创建这些 url(因为我需要在使用 WebService 的 iPhone 应用程序中使用该 url)。

标签: java spring spring-mvc jpa


【解决方案1】:

1) 将 userImageLink 标记为 @Transient,因为 JPA 将使用该类的所有属性,除非您专门使用 @Transient 标记它们,如下所示:

@Transient
private String userImageLink;

2) 一旦 Release 实体类填充了 DB 值,然后假设 httpservletrequest 对象可用:

StringBuilder baseURL = new StringBuilder();
baseURL.append(request.getRequestURL().toString().replace(request.getRequestURI(), ""));

baseURL.append("/resources/images/").append(release.getUser());

release.setUserImageLink(baseURL);

【讨论】:

    【解决方案2】:

    您可以使用您的应用程序ServletContext 生成图片的URL。 这个 ServletContext 不能作为 POJO 访问到您的 JPA 实体中,但应该作为 bean 与 Spring 容器一起注入,否则您最终会得到 null 引用:

    • 在您的实体中将静态实例变量自动装配为 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.
      }
      //...
    }
    
    • 使用注入的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

    【讨论】:

      【解决方案3】:

      https://stackoverflow.com/a/24122238/934719 为这个问题提供了一个非常简单的解决方案,无需自动装配等即可工作:

      public static String getContextParameter(String param){
          try {
              InitialContext initialContext = new InitialContext();
              Context environmentContext = (Context) initialContext.lookup("java:/comp/env");
              return (String) environmentContext.lookup(param);
          } catch (NamingException e) {
              e.printStackTrace();
          }
          return null;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-03-14
        • 2015-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-16
        • 2016-03-21
        相关资源
        最近更新 更多