将Spring MVC中的静态.json文件作为资源返回

时间:2013-06-07 10:22:53

标签: spring spring-mvc

我想从服务器返回一个静态.json文件。不仅是出于测试目的,我想将json文件定义为资源文件(比如data.json),这样我就可以轻松修改它。

我已经完成了这项工作,将data.json放在资源目录中并使用以下命令指定资源映射:

<resources mapping="/resources/**" location="/resources/" />

我的问题是,当返回data.json时,内容类型为application/octet-stream,而我希望它为application/json。我该如何指定?

此外,在我的控制器中,我有一些方法返回一个字符串(例如home),它通过InternalResourceViewResolver自动映射到jsp:

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".jsp" />
</beans:bean>

如何为.json资源做同样的事情(显然没有jsp编译过程)?

4 个答案:

答案 0 :(得分:2)

我认为在你的web.xml中你可以添加:

<mime-mapping>
  <extension>json</extension>
  <mime-type>application/json</mime-type>
</mime-mapping>

我相信这将指示Web容器将application / json mime类型应用于任何以.json扩展名提供的文件。

答案 1 :(得分:0)

您可以通过为所请求的控制器方法添加@ResponseBody,从控制器发送响应作为jSON字符串,如:

public @ResponseBody String getJsonDetails(){

return object; // object may be your list of object(which will send response as JSON) or simple json string
}

您需要通过在spring-context xml文件中添加以下bean来配置它:

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="mediaTypes">
         <map>
            <entry key="html" value="text/html"/>
            <entry key="json" value="application/json"/>
        </map>
        </property>

        <property name="defaultViews">
            <list>
                <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
                    <property name="prefixJson" value="true"/>
                </bean>
            </list>
        </property>
    </bean>

答案 2 :(得分:0)

重温旧问题,只是提供最新的答案。以下代码段应该是不言自明的:

@RestController
public class JsonController {

@GetMapping(value = "/file", produces = MediaType.APPLICATION_JSON_VALUE)
public String defaultQuiz() {
    Resource resource = new ClassPathResource("data.json");
    String json = "";
    try(InputStream stream = resource.getInputStream()) {
        json = StreamUtils.copyToString(stream, Charset.forName("UTF-8"));
    } catch (IOException ioe) {
        throw new YourCustomRuntimeException(ioe.getMessage(), ioe);
    }
    return json;
  }
 }

答案 3 :(得分:0)

我做到了。

@GetMapping(value = "/my-endpoint",
    produces = MediaType.APPLICATION_JSON_VALUE)
public String fetchJson() {
    String json = "";
    try(InputStream stream = getClass().getResourceAsStream("/my-static-json.json")) {
        json = StreamUtils.copyToString(stream, Charset.forName("UTF-8"));
    } catch (IOException ioe) {
        log.error("Couldn't fetch JSON! Error: " +
                ioe.getMessage());
    }
    return json;
}

注意:JSON 文件在 src/main/resources 下