我已经浏览了Google,并在此处提出其他问题,但无济于事。他们都说同样的事情......为jersey-json导入.jar(完成),将依赖项添加到pom.xml(已完成)并将POJOMappingFeature添加到web.xml(已完成),但我仍然无法访问Restful Web服务,JSON进入或退出服务器。
的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 :(得分:2)
看来你缺少JacksonJsonProvider.class用于编组和解组,可以在jackson-core-asl-1.9.2.jar中找到
答案 1 :(得分:1)
您可能需要添加ObjectMapper类。 例如,在我的Jersey-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
答案 2 :(得分:0)
尝试将Genson library添加到您的类路径中。 它是一个在java和json之间进行转换的java库。它与泽西岛的效果非常好。您只需将jar放入类路径中即可。
答案 3 :(得分:0)
我遇到了同样的问题,在RequestInfo中将@XmlElement更改为@XmlRootElement解决了我的问题。
import javax.xml.bind.annotation.XmlRootElement;