我正在使用 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/