【问题标题】:How to Accept JSON input in Spring Restful Webservice?如何在 Spring Restful Webservice 中接受 JSON 输入?
【发布时间】:2013-11-15 02:50:12
【问题描述】:

我很难接受 JSON 输入到我的 Spring Restful Web 服务中。基本上我的目的是接受 JSON 并返回一个 zip 文件。但我无法跨过第一步。 以下是控制器代码

@Controller
@RequestMapping(value = "/request")
public class PasskitController {

@Autowired
@Qualifier("PassManager")
private PassManager pm;

/*headers = { "Accept:application/json" }, 
consumes = MediaType.APPLICATION_JSON_VALUE,*/

@RequestMapping(value = "/createPass", method = RequestMethod.POST,
        consumes = MediaType.APPLICATION_JSON_VALUE,
        produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public @ResponseBody ByteArrayOutputStream createGiftPass(
        @RequestBody PassGenerationRequest request) throws IOException {
    System.out.println("in createGiftPass() method");
    String success = "Success";
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    baos.write(success.getBytes());
    return baos;
}

@RequestMapping(value = "/test", method = RequestMethod.GET, 
        produces = MediaType.TEXT_PLAIN_VALUE)
public @ResponseBody
String test() throws IOException {
    System.out.println("in test() method");
    return "Success";
}
}

我需要将输入的 JSON 映射到下面的 pojo PassGenerationRequest

@JsonAutoDetect
public class PassGenerationRequest {

private String serialNumber;
private String upc;
private String campaign;
private String merchant;

public String getSerialNumber() {
    return serialNumber;
}

public void setSerialNumber(String serialNumber) {
    this.serialNumber = serialNumber;
}

public String getUpc() {
    return upc;
}

public void setUpc(String upc) {
    this.upc = upc;
}

public String getCampaign() {
    return campaign;
}

public void setCampaign(String campaign) {
    this.campaign = campaign;
}

public String getMerchant() {
    return merchant;
}

public void setMerchant(String merchant) {
    this.merchant = merchant;
}
}

以下是spring-servlet.xml中配置的不同HttpMessageConverters

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="jsonMessageConverter" />
            <ref bean="byteArrayMessageConverter"/>
            <ref bean="stringMessageConverter"/>
        </list>
    </property>

</bean>

<bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" >
    <property name="supportedMediaTypes" value="application/json" />
</bean>

<bean id="byteArrayMessageConverter"
    class="org.springframework.http.converter.ByteArrayHttpMessageConverter" >
    <property name="supportedMediaTypes" value="application/octet-stream" />
</bean>

<bean id="stringMessageConverter"
    class="org.springframework.http.converter.StringHttpMessageConverter" >
    <property name="supportedMediaTypes" value="text/plain" />
</bean>

目前我得到 Content type 'text/plain; charset=UTF-8' 不支持例外。

如果我添加 header={"Accept: application/json"} 则会收到异常提示 No handler found for the request "request/createPass"

有谁能帮帮我吗?

谢谢。

【问题讨论】:

  • 您的请求是什么样的?
  • 我实际上是在使用 Postman 应用发布我的请求。

标签: java json spring web-services spring-mvc


【解决方案1】:

验证您的请求是否已将 Content-Type 设置为 application/json

Accept 描述了您希望在响应中看到的媒体类型。您已经为二进制数据设置了该设置,因此当您提供 application/json 时,Spring 看不到匹配项。

【讨论】:

  • 我正在使用 Postman,这是一个 chrome 应用程序来发布我的请求。我将内容类型设置为 JSON 仍然遇到同样的问题。我也尝试通过 CURL 发布。以下是我的 CURL 请求curl -i -H "Content-Type: application/json" -X POST -d '{"serialNumber":"1234","upc":"12345","campaign":"155950","merchant":"ASDA"}' http://localhost:8080/passkit-service-app-1.0/passkit/request/createPass
  • 即使我将标题信息包含为headers = { "Accept:application/octet-stream" },我相信如果我返回 ByteArrayOutputStream 它是适用的,它也会给我 HTTP 404,这是找不到资源
  • 您的 Web 应用程序的上下文是什么?例如,可能是passkit,url 应该是http://localhost:8080/passkit/request/createPass
  • url http://localhost:8080/passkit-service-app-1.0/passkit/request/test 适用于上面代码中的test() 方法。它不适用于http://localhost:8080/passkit-service-app-1.0/passkit/request/createPass,它是createGiftPass() 方法的url。我还尝试将 test() 方法转换为 POST 并开始给出 404 错误。所以看起来像是 POST 方法的问题。
  • spring-servlet 配置或控制器中是否缺少任何内容?可能是内容协商视图解析器(不确定在这种情况下是否适用)。是否有任何使用 JSON 作为输入的 Spring Rest Webservice 的工作示例,您可以指出我。
【解决方案2】:

确保 Jackson 库在类路径中消息转换器 MappingJacksonHttpMessageConverter 用于 rel 2 之前的旧 jackson 库,在 rel 2 之后您需要添加 MappingJackson2HttpMessageConverter, 您也可以使用简单的“”删除注释方法处理程序,并在类路径中使用 jackson lib,它会自动选择您所需的消息转换器。

【讨论】:

    【解决方案3】:

    使用这个

    <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="jsonMessageConverter" />
            </list>
        </property>
    </bean> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-07
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-24
      • 1970-01-01
      相关资源
      最近更新 更多