如何在Spring Restful Webservice中接受JSON输入?

7

我在将JSON输入到我的Spring Restful Webservice中遇到了困难。基本上,我的目的是接受一个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>

目前我遇到了内容类型 'text/plain; charset=UTF-8' 不受支持的异常。

如果我添加header={"Accept: application/json"},那么就会出现请求“request/createPass”找不到处理程序的异常。

请问有人可以帮我解决这个问题吗?

谢谢。


你的请求是什么样子的? - Sotirios Delimanolis
我实际上是在使用 Postman 应用程序来发布我的请求。 - user2985202
3个回答

1

请确认您的请求中设置了Content-Typeapplication/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 - user2985202
即使我将头信息包含在 headers = { "Accept:application/octet-stream" } 中,我认为如果我返回 ByteArrayOutputStream,它会给我 HTTP 404,表示没有找到资源。 - user2985202
你的网页应用程序的上下文是什么?例如,它可能是“passkit”,URL 应该是“http://localhost:8080/passkit/request/createPass”。 - Vidya
上面代码中,http://localhost:8080/passkit-service-app-1.0/passkit/request/test 这个 URL 在 test() 方法的情况下是有效的。但是对于 createGiftPass() 方法的 URL http://localhost:8080/passkit-service-app-1.0/passkit/request/createPass 却无效。我还尝试将 test() 方法转换为 POST,结果出现了 404 错误。因此看起来问题出在 POST 方法上。 - user2985202
在spring-servlet配置或控制器中是否有我遗漏的内容?也许是内容协商视图解析器(不确定是否适用于此情况)。您能否指向任何使用JSON作为输入的Spring Rest Webservice的工作示例。 - user2985202

1
请确保Jackson库在类路径中。Message converter MappingJacksonHttpMessageConverter适用于版本2之前的旧版jackson lib,版本2之后需要添加MappingJackson2HttpMessageConverter。同时,如果您的类路径中有jackson库,可以使用简单的""删除注释方法处理程序,并且它会自动选择所需的消息转换器。

0

请使用这个

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接