2012-12-10 50 views
1

张贴JSON时候我已经通过谷歌搜索,并在这里等问题,都无济于事。他们都说着同样的事情...导入了球衣,JSON(完成)将.jar,添加依赖关系的pom.xml(完成)和POJOMappingFeature添加到web.xml(完成),但我仍然无法使用JSON进入Restful Web服务或从服务器出来。415错误在Java中与新泽西

的web.xml

<web-app id="WebApp_ID" version="2.4" 
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
<display-name>My Application</display-name> 

<servlet> 
    <servlet-name>jersey-serlvet</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <param-value>my.app</param-value> 
    </init-param> 
    <init-param> 
     <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>jersey-serlvet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

的pom.xml

<dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-server</artifactId> 
     <version>1.8</version> 
    </dependency> 


    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-json</artifactId> 
     <version>1.8</version> 
    </dependency> 

服务方法:

@POST 
@Path("/request") 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
public ResponseInfo Request(RequestInfo requestInfo) 

两个ResponseInfo和RequestInfo具有@XmlRoot和@XmlElement注释。 我在Tomcat 7.0.33本地运行,并出现以下错误:

SEVERE: A message body reader for Java class   
my.app.RequestInfo, and Java type class my.app.RequestInfo, and MIME media type 
application/json was not found. 
The registered message body readers compatible with the MIME media type are: 
application/json -> 
    com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App 
    com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App 
    com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App 
*/* -> 
    com.sun.jersey.core.impl.provider.entity.FormProvider 
    com.sun.jersey.core.impl.provider.entity.StringProvider 
    com.sun.jersey.core.impl.provider.entity.ByteArrayProvider 
    com.sun.jersey.core.impl.provider.entity.FileProvider 
    com.sun.jersey.core.impl.provider.entity.InputStreamProvider 
    com.sun.jersey.core.impl.provider.entity.DataSourceProvider 
    com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General 
    com.sun.jersey.core.impl.provider.entity.ReaderProvider 
    com.sun.jersey.core.impl.provider.entity.DocumentProvider 
    com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader 
    com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader 
    com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader 
    com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General 
    com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General 
    com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General 
    com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General 
    com.sun.jersey.core.impl.provider.entity.EntityHolderReader 
    com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General 
    com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General 
+0

您是否忘记在服务方法中包含HTTP谓词,或者您是否还没有在实际代码中使用HTTP谓词? – Perception

+0

更新后的问题...这是代码,而不能复制/粘贴 – cren90

回答

1

看来你缺少JacksonJsonProvider.class编组和解组,可以在杰克逊核心ASL-1.9.2.jar

0

尝试增加Genson library到类路径中。 这是一个Java库做Java和JSON之间的转换。它在泽西岛运作良好。你只需要将jar放入你的类路径。

0

您可能需要添加一个ObjectMapper类中找到。 例如,在我的球衣的Java示例应用程序,当我的客户希望创建一个帐户,这是一种在服务器上运行的逻辑:

@Path("/makeStormpathAccount") 
public class StormpathAccount { 

    @POST 
    public void createAccount(UserAccount userAccount) throws Exception { 

注意我是如何有(UserAccount userAccount)作为参数我的路线方法。该UserAccount类看起来是这样的:

import org.codehaus.jackson.annotate.JsonProperty; 

public class UserAccount { 

    @JsonProperty 
    private String first_name; 

    @JsonProperty 
    private String last_name; 

    @JsonProperty 
    private String user_name; 

    @JsonProperty 
    private String email; 

    @JsonProperty 
    private String password; 


    public String getFirstName() { 
     return first_name; 
    } 

    public String getLastName() { 
     return last_name; 
    } 

    public String getUserName() { 
     return user_name; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public String getPassword() { 
     return password; 
    } 
} 

并使用这一ObjectMapper类实际映射数据:

import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.SerializationConfig; 

import javax.ws.rs.ext.ContextResolver; 
import javax.ws.rs.ext.Provider; 

@Provider 
public class MyObjectMapperProvider implements ContextResolver<ObjectMapper> { 

    final ObjectMapper defaultObjectMapper; 

    public MyObjectMapperProvider() { 
     defaultObjectMapper = createDefaultMapper(); 
    } 

    @Override 
    public ObjectMapper getContext(Class<?> type) { 
     return defaultObjectMapper; 
    } 

    private static ObjectMapper createDefaultMapper() { 
     final ObjectMapper result = new ObjectMapper(); 
     result.configure(SerializationConfig.Feature.INDENT_OUTPUT, true); 

     return result; 
    } 

} 

转换的JSON从客户端发送,直到Java!

来源:https://github.com/rkazarin/sample-jersey-webapp/tree/master/src/main/java/com/sample/jersey/app

0

我面临同样的问题,并在RequestInfo改变@XmlElement到@XmlRootElement解决我的问题。

import javax.xml.bind.annotation.XmlRootElement;