Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在SpringMVC中定义基于url扩展的消息转换器?_Java_Spring_Spring Mvc - Fatal编程技术网

Java 如何在SpringMVC中定义基于url扩展的消息转换器?

Java 如何在SpringMVC中定义基于url扩展的消息转换器?,java,spring,spring-mvc,Java,Spring,Spring Mvc,我如何影响在AnnotationMethodHandlerAdapter中为url扩展生成的POJO选择消息转换器的过程? 我希望有一个数据对象的更多表示,而数据表示应该由请求的url扩展选择,例如/users/2.xml或/users/2.json 消息处理程序的当前配置,应根据url扩展选择: <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">

我如何影响在AnnotationMethodHandlerAdapter中为url扩展生成的POJO选择消息转换器的过程? 我希望有一个数据对象的更多表示,而数据表示应该由请求的url扩展选择,例如/users/2.xml或/users/2.json

消息处理程序的当前配置,应根据url扩展选择:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
            <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"
                p:marshaller-ref="xmlMarshaller" p:unmarshaller-ref="xmlMarshaller" />
        </list>
    </property>
</bean>
有一种方法,我非常熟悉,那就是使用,但是我想绕过视图分辨率的过程,直接使用消息转换器。此外,在创建操作时,在public ResponseEntity showUser中使用ResponseEntity可对生成的http状态代码定义进行细粒度控制OK、NOT_FOUND、NO_CONTENT、。。。我找不到将ResponseEntity与ContentNegotiatingViewResolver结合使用的方法,这也能满足我的需求

另一种方法是根据url扩展将请求接受头修改为application/xml或application/json。这样,所有处理都应直接转到已配置的消息转换器。但是,我不知道如何合理地篡改请求头

谢谢。

由于choose of HttpMessageConverters使用Accept请求标头,因此实现内容协商的最简单方法可能是将此标头替换为URL扩展指定的所需媒体类型

这可以实现为使用HttpServletRequestWrapper替换头值的过滤器,也可以按照Spring 3.0.2中的建议重写AnnotationMethodHanlderAdapter.createHttpInputMessage


另请参见。

我也有同样的需要,并拼凑了一个servlet过滤器来完成这项任务。不是一件艺术品,但能完成工作:

public class UrlExtensionFilter implements Filter {

public void init(FilterConfig filterConfig) throws ServletException {
}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest httpServletRequest = (HttpServletRequest)request;
    if (httpServletRequest.getRequestURI().endsWith(".json")) {
        MyAcceptHeaderRequest acceptHeaderRequest = new MyAcceptHeaderRequest(httpServletRequest);
        acceptHeaderRequest.setAcceptHeader("application/json");
        filterChain.doFilter(acceptHeaderRequest, response);
    } else if (httpServletRequest.getRequestURI().endsWith(".xml")) {
        MyAcceptHeaderRequest acceptHeaderRequest = new MyAcceptHeaderRequest(httpServletRequest);
        acceptHeaderRequest.setAcceptHeader("text/xml");
        filterChain.doFilter(acceptHeaderRequest, response);
    } else {
        filterChain.doFilter(request, response);
    }
}

public void destroy() {
}

public class MyAcceptHeaderRequest extends HttpServletRequestWrapper {

    private String accept = "application/json";

    public MyAcceptHeaderRequest(HttpServletRequest request) throws IOException {
        super(request);
    }

    public void setAcceptHeader(String value) {
        accept = value;
    }

    @Override
    public String getHeader(String name) {
        if (name.equalsIgnoreCase("accept") || name.equalsIgnoreCase("content-type")) {
            return accept;
        } else {
            return super.getHeader(name);
        }
    }

    @Override
    public Enumeration getHeaders(String name) {
        if (name.equalsIgnoreCase("accept") || name.equalsIgnoreCase("content-type")) {
            Enumeration enumeration = new StringTokenizer(accept);
            return enumeration;
        } else {
            return super.getHeaders(name);
        }
    }

    @Override
    public String getContentType() {
        return accept;
    }

    @Override
    public String getParameter(String name) {
        // When we're using this class and it is a POST operation then the body is JSON or XML so don't allow
        // attempts to retrieve parameter names to consume the input stream
        if (this.getMethod().equals("POST")) {
            return null;
        } else {
            return super.getParameter(name);
        }
    }

    @Override
    public String[] getParameterValues(String name) {
        // When we're using this class and it is a POST operation then the body is JSON or XML so don't allow
        // attempts to retrieve parameter names to consume the input stream
        if (this.getMethod().equals("POST")) {
            return null;
        } else {
            return super.getParameterValues(name);
        }
    }
}
}

谢谢,你救了我一天:走SPR-7517路