2013-09-11 70 views
0

我有POST方法的ajax请求。请求将Json数据发布到服务器。我想这个JSON解析到一个像这样的字符串:Json在泽西岛中的字符串

@POST 
@Path("file/save") 
@Consumes(MediaType.APPLICATION_JSON) 
public void save(String content) { 
} 

我得到这个错误每次我尝试对服务器的请求:

“错误400无法反序列化java.lang.String中的实例出START_OBJECT令牌”

下面是详细的POST请求:

Request URL: http://localhost:8181/file/save 
Request Method:POST 
Status Code:400 Bad Request 

Request Headers 
Accept:*/* 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Connection:keep-alive 
Content-Length:379 
Content-Type:application/json 
Cookie:JSESSIONID=0AFC5FF7F201391DD67CCB0DA1BCD25C 
Host:localhost:8181 
Origin:http://localhost:8181 
Referer:http://localhost:8181 
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36 
X-Requested-With:XMLHttpRequest 

Query String Parameters 

Request Payload 
<my json data> 

Response Headers 
Cache-Control:must-revalidate,no-cache,no-store 
Content-Length:1369 
Content-Type:text/html;charset=ISO-8859-1 
Date:Wed, 11 Sep 2013 03:11:03 GMT 
Server:Apache-Coyote/1.1 

我该如何解决这个问题?谢谢!

+1

**,**,**是产生400的HTTP POST请求?请包括所有标题和正文。 –

回答

1

问题是您的JAX-RS实现(在这种情况下为泽西岛)不知道如何将application/json内容映射到String。您需要注册MessageBodyReader<String>实施,并注明@Consumes(MediaType.APPLICATION_JSON)

补遗

实现一个MessageBodyReader一个转换为String是直截了当的。

@Provider 
@Consumes(MediaType.APPLICATION_JSON) 
public class JsonStringReader implements MessageBodyReader<String> 
{ 
    @Override 
    public boolean isReadable(
     Class<?> type, 
     Type genericType, 
     Annotation[] annotations, 
     MediaType mediaType 
    ) 
    {return type == String.class;} 

    @Override 
    public String readFrom(
     Class<String> type, 
     Type genericType, 
     Annotation[] annotations, 
     MediaType mediaType, 
     MultivaluedMap<String, String> httpHeaders, 
     InputStream entityStream 
    ) throws IOException, WebApplicationException 
    { 
     final String charsetName = mediaType.getParameters().get(MediaType.CHARSET_PARAMETER); 
     final Charset charset = charsetName == null ? Charset.forName("UTF-8") : Charset.forName(charsetName); 
     final StringBuilder builder = new StringBuilder(); 
     final Reader reader = new InputStreamReader(entityStream, charset); 
     final CharBuffer buffer = CharBuffer.allocate(1024); 
     while (reader.read(buffer) != -1) 
     { 
     buffer.flip(); 
     builder.append(buffer); 
     buffer.clear(); 
     } 
     return builder.toString(); 
    } 
} 

有几种方法可以通过JAX-RS实现注册实体提供者。这可能与泽西更简单的方法是添加以下到您的web.xml

<init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>pkg.that.contains.the.messagereader</param-value> 
</init-param> 

上创建新泽西实体提供进一步的信息可以在这里找到:https://jersey.java.net/documentation/latest/message-body-workers.html

上配置新泽西州的更多信息可以在这里找到:http://jersey.java.net/nonav/apidocs/1.8/jersey/com/sun/jersey/spi/container/servlet/ServletContainer.html

+0

你能告诉我该怎么做吗? –

+0

在文体上,有一个名为“文件/保存”的资源只能发布到不是真正的RESTful。在真正的REST风格中,您可能有一个名为“files”的资源,GET从该资源返回现有内容URI的列表,并从中添加新资源并通过HTTP 201创建的响应返回其URI。 – reggert