Velocity与Jersey集成,ResourceTool未正确初始化

Velocity与Jersey集成,ResourceTool未正确初始化,jersey,jax-rs,velocity,Jersey,Jax Rs,Velocity,我正在将Velocity与Jersey集成,而ResourceTool for i18n面临一个问题 集成过程如下所示: web.xml(带条纹,与相关部分保持一致): 上下文配置 类路径:applicationContext.xml 速度滤波器 org.apache.velocity.tools.view.VelocityViewFilter 速度滤波器 RESTservlet org.springframework.web.context.ContextLoaderListener RES

我正在将Velocity与Jersey集成,而ResourceTool for i18n面临一个问题

集成过程如下所示:

web.xml(带条纹,与相关部分保持一致):


上下文配置
类路径:applicationContext.xml
速度滤波器
org.apache.velocity.tools.view.VelocityViewFilter
速度滤波器
RESTservlet
org.springframework.web.context.ContextLoaderListener
RESTservlet
com.sun.jersey.spi.spring.container.servlet.SpringServlet
com.sun.jersey.config.property.packages
my.package.demo
1.
RESTservlet
/休息/*
现在,我的tools.xml(在WEB-INF文件夹中):


然后我创建了一个基本的VelocityTemplateProcessor

package my.package.demo;

import static com.google.common.base.Strings.isNullOrEmpty;

import java.io.IOException;
import java.io.OutputStream;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.Provider;

import org.apache.velocity.Template;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.tools.ToolContext;
import org.apache.velocity.tools.view.ServletUtils;
import org.apache.velocity.tools.view.VelocityView;

import com.sun.jersey.api.core.HttpContext;
import com.sun.jersey.api.view.Viewable;
import com.sun.jersey.spi.template.ViewProcessor;

@Provider
public class VelocityTemplateProcessor implements ViewProcessor<Template> {

    private static Map<MediaType, String> fileExtension;

    static {
        fileExtension = new HashMap<>();
        fileExtension.put(MediaType.TEXT_HTML_TYPE, ".html.vm");
        fileExtension.put(MediaType.APPLICATION_JSON_TYPE, ".json.vm");
        fileExtension.put(MediaType.APPLICATION_XML_TYPE, ".xml.vm");
    }

    @Context
    private HttpContext httpContext;

    private final VelocityView velocityView;

    public VelocityTemplateProcessor(@Context final ServletContext servletContext) {
        velocityView = ServletUtils.getVelocityView(servletContext);
    }

    @Override
    public Template resolve(final String name) {
        if (isNullOrEmpty(name)) {
            return null;
        }
        final MediaType mediaType = httpContext.getResponse().getMediaType();
        final String extension = fileExtension.get(mediaType);
        if (isNullOrEmpty(extension)) {
            return null;
        }
        try {
            return velocityView.getTemplate(name + extension);
        } catch (final ResourceNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public void writeTo(final Template t, final Viewable viewable, final OutputStream out) throws IOException {
        final ToolContext context = velocityView.createContext();
        context.put("data", viewable.getModel());
        final Writer writer = new StringWriter();
        t.merge(context, writer);
        out.write(writer.toString().getBytes());
    }

}
package my.package.demo;
导入静态com.google.common.base.Strings.isNullOrEmpty;
导入java.io.IOException;
导入java.io.OutputStream;
导入java.io.StringWriter;
导入java.io.Writer;
导入java.util.HashMap;
导入java.util.Map;
导入javax.servlet.ServletContext;
导入javax.ws.rs.core.Context;
导入javax.ws.rs.core.MediaType;
导入javax.ws.rs.ext.Provider;
导入org.apache.velocity.Template;
导入org.apache.velocity.exception.ResourceNotFoundException;
导入org.apache.velocity.tools.ToolContext;
导入org.apache.velocity.tools.view.ServletUtils;
导入org.apache.velocity.tools.view.VelocityView;
导入com.sun.jersey.api.core.HttpContext;
导入com.sun.jersey.api.view.view;
导入com.sun.jersey.spi.template.ViewProcessor;
@提供者
公共类VelocityTemplateProcessor实现了ViewProcessor{
私有静态映射文件扩展;
静止的{
fileExtension=newhashmap();
fileExtension.put(MediaType.TEXT\u HTML\u TYPE,.HTML.vm);
fileExtension.put(MediaType.APPLICATION_JSON_TYPE,.JSON.vm);
fileExtension.put(MediaType.APPLICATION\uxml\utype,.XML.vm);
}
@上下文
私有HttpContext HttpContext;
私人最终速度视图速度视图;
公共VelocityTemplateProcessor(@Context final ServletContext ServletContext){
velocityView=ServletUtils.getVelocityView(servletContext);
}
@凌驾
公共模板解析(最终字符串名称){
if(isNullOrEmpty(名称)){
返回null;
}
final MediaType MediaType=httpContext.getResponse().getMediaType();
最终字符串扩展名=fileExtension.get(mediaType);
if(isNullOrEmpty(扩展)){
返回null;
}
试一试{
返回velocityView.getTemplate(名称+扩展名);
}捕获(最终资源未发现异常e){
e、 printStackTrace();
}
返回null;
}
@凌驾
public void writeTo(最终模板t、最终可查看、最终输出流输出)引发IOException{
final ToolContext context=velocityView.createContext();
put(“data”,viewable.getModel());
最终编写器=新的StringWriter();
t、 合并(上下文、作者);
out.write(writer.toString().getBytes());
}
}
除了ResourceTool之外,它工作得很好。它似乎正确地加载了请求的配置(至少在ToolContext中是这样显示的),但是,当我尝试在模板内调用
$text.my.property
时,它似乎使用了具有默认配置的ResourceTool(包名为“resources”),然后找不到我的密钥。

当我明确提到
$text.bundle('my.package.demo.Resource').my.property
时,它就起作用了,但我想让它对管理模板的人员更加透明。

无需担心。我找到了。我必须使用
HttpServletRequest
HttpServletResponse
创建
ToolContext
。两者都注入了
@Context
。现在很有魅力

<?xml version="1.0" encoding="UTF-8"?>                                               
<tools>                                                                              
    <data type="boolean" key="STRUTS_TOOLS_AVAILABLE" value="false"/>                
    <toolbox scope="request">                                                        
        <tool class="org.apache.velocity.tools.generic.ResourceTool"                 
            bundles="my.package.demo.Resource" />                               
    </toolbox>                                                                       
</tools>                                                                             
package my.package.demo;

import static com.google.common.base.Strings.isNullOrEmpty;

import java.io.IOException;
import java.io.OutputStream;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.Provider;

import org.apache.velocity.Template;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.tools.ToolContext;
import org.apache.velocity.tools.view.ServletUtils;
import org.apache.velocity.tools.view.VelocityView;

import com.sun.jersey.api.core.HttpContext;
import com.sun.jersey.api.view.Viewable;
import com.sun.jersey.spi.template.ViewProcessor;

@Provider
public class VelocityTemplateProcessor implements ViewProcessor<Template> {

    private static Map<MediaType, String> fileExtension;

    static {
        fileExtension = new HashMap<>();
        fileExtension.put(MediaType.TEXT_HTML_TYPE, ".html.vm");
        fileExtension.put(MediaType.APPLICATION_JSON_TYPE, ".json.vm");
        fileExtension.put(MediaType.APPLICATION_XML_TYPE, ".xml.vm");
    }

    @Context
    private HttpContext httpContext;

    private final VelocityView velocityView;

    public VelocityTemplateProcessor(@Context final ServletContext servletContext) {
        velocityView = ServletUtils.getVelocityView(servletContext);
    }

    @Override
    public Template resolve(final String name) {
        if (isNullOrEmpty(name)) {
            return null;
        }
        final MediaType mediaType = httpContext.getResponse().getMediaType();
        final String extension = fileExtension.get(mediaType);
        if (isNullOrEmpty(extension)) {
            return null;
        }
        try {
            return velocityView.getTemplate(name + extension);
        } catch (final ResourceNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public void writeTo(final Template t, final Viewable viewable, final OutputStream out) throws IOException {
        final ToolContext context = velocityView.createContext();
        context.put("data", viewable.getModel());
        final Writer writer = new StringWriter();
        t.merge(context, writer);
        out.write(writer.toString().getBytes());
    }

}