一、配置
1. 配置类中添加属性配置和注册FreemarkerMvcFeature
//register(MvcFeature.class);
property(MvcFeature.TEMPLATE_BASE_PATH+".freemarker", "freemarker");
//property(MvcFeature.ENCODING+".freemarker", "GBK");//如果@Produces没指定输出编码,则以此设置为准,默认UTF-8
property(FreemarkerMvcFeature.TEMPLATE_OBJECT_FACTORY,new FreemarkerConfig(null));
register(FreemarkerMvcFeature.class);//依赖MvcFeature
2. freemarker配置
import com.hiekn.demo.exception.FtlException;
import com.hiekn.demo.util.FtlMethod;
import freemarker.cache.*;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Version;
import jersey.repackaged.com.google.common.collect.Lists;
import org.glassfish.jersey.server.mvc.freemarker.FreemarkerConfigurationFactory;
import org.jvnet.hk2.annotations.Optional;
import javax.inject.Inject;
import javax.servlet.ServletContext;
import java.io.File;
import java.util.List;
import java.util.Properties;
public class FreemarkerConfig implements FreemarkerConfigurationFactory {
protected final Configuration configuration;
@Inject
public FreemarkerConfig(@Optional final ServletContext servletContext){
Version version = Configuration.VERSION_2_3_23;
configuration = new Configuration(version);
configuration.setSharedVariable("cutStr", new FtlMethod());
configuration.setDefaultEncoding("utf-8");//如果.ftl不在返回视图里,而是通过include引进去的,受此属性影响,不受@Produces影响
configuration.setTemplateExceptionHandler(new FtlException());
configuration.setIncompatibleImprovements(version);
configuration.setObjectWrapper(new DefaultObjectWrapper(version));
final List<TemplateLoader> loaders = Lists.newArrayList();
Properties p = new Properties();
try {
p.load(FreemarkerConfig.class.getClassLoader().getResourceAsStream("freemarker.properties"));
configuration.setSettings(p);
if (servletContext != null) {
loaders.add(new WebappTemplateLoader(servletContext));
}
loaders.add(new ClassTemplateLoader(FreemarkerConfig.class, "/"));
loaders.add(new FileTemplateLoader(new File("/")));
} catch (Exception e) {
e.printStackTrace();
}
configuration.setTemplateLoader(new MultiTemplateLoader(loaders.toArray(new TemplateLoader[loaders.size()])));
}
@Override
public Configuration getConfiguration() {
return configuration;
}
}
二、集成Spring
添加依赖
如果要使用Jersey Spring DI支持,您需要将jersey-spring4模块添加到依赖关系列表中:
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring4</artifactId>
<version>2.26</version>
</dependency>
上述模块为Spring模块添加了传递依赖关系。 有关依赖关系的列表和范围的更多详细信息,请参阅jersey-spring4模块依赖项。 请注意,该模块取决于Spring / HK2 Bridge,用于将Spring服务注入HK2服务或将HK2服务注入Spring服务。
使用说明
Jersey提供了支持Spring DI的扩展。这使得Jersey可以使用Spring bean作为JAX-RS组件(例如资源和提供者),并且还允许Spring注入到被Jersey管理的组件中。
Spring扩展模块配置是基于注解的。 Spring bean被注入,JAX-RS类使用注解后被Spring管理。 注入Spring bean可以使用Spring XML配置注入更多的依赖关系。 支持Spring单例和请求范围。
为了使JAX-RS资源能够运行需要代理的Spring功能,例如Spring事务管理(使用@Transactional),Spring Security和面向方面的编程(例如@Aspect),资源必须由Spring管理,通过注释 @Component,@Service,@Controller或@Repository:
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import org.springframework.stereotype.Component;
@Component
@Path("/")
public class SomeResource {
@Transactional
@GET
public void updateResource() {
// ...
}
}
注意: Spring beans不能通过使用Spring XML配置直接注入JAX-RS类
三、视图控制器
import freemarker.ext.beans.BeansWrapper;
import freemarker.ext.beans.BeansWrapperBuilder;
import freemarker.template.Configuration;
import freemarker.template.TemplateHashModel;
import freemarker.template.TemplateModelException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.apache.log4j.Logger;
import org.glassfish.jersey.server.mvc.Template;
import org.glassfish.jersey.server.mvc.Viewable;
import org.springframework.stereotype.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import java.util.HashMap;
import java.util.Map;
@Controller
@Path("/ftl")
@Produces(MediaType.TEXT_HTML+";charset=UTF-8")
@Api("返回视图")
public class Ftl {
static final Logger log = Logger.getLogger(Ftl.class);
@GET
@Path("/test")
@ApiOperation("测试返回视图")
public Viewable exampleView(@Context HttpServletRequest request) {
Map<String, Object> data = new HashMap<>();
data.put("test", "this is the ViewResource test text");
data.put("request", request);
BeansWrapper wrapper = new BeansWrapperBuilder(Configuration.VERSION_2_3_23).build();
TemplateHashModel staticModels = wrapper.getStaticModels();
data.put("statics", staticModels);
TemplateHashModel enumModels = wrapper.getEnumModels();
data.put("enums",enumModels);
try {
TemplateHashModel fileStatics = (TemplateHashModel) staticModels.get("java.io.File");
data.put("File", fileStatics);
TemplateHashModel roundingModeEnums = (TemplateHashModel) enumModels.get("java.math.RoundingMode");
data.put("RoundingMode", roundingModeEnums);
} catch (TemplateModelException e) {
e.printStackTrace();
}
return new Viewable("/test", data);
}
@Path("/")
@GET
@Template(name = "/index")
@ApiOperation("测试返回视图默认页")
public Map<String, Object> indexView() {
Map<String, Object> map = new HashMap<>();
System.out.println("我是首页");
return map;
}
@Path("{path}")
@GET
@ApiOperation("根据请求路径返回对应页")
public Viewable common(@PathParam("path") String path) {
Map<String, Object> map = new HashMap<>();
return new Viewable("/"+path,map);
}
}