【问题标题】:415 Error when posting JSON in Java with Jersey使用 Jersey 在 Java 中发布 JSON 时出现 415 错误
【发布时间】:2012-12-10 22:58:34
【问题描述】:

我已经浏览了谷歌以及这里的其他问题,但无济于事。他们都说同样的话......导入jersey-json的.jar(完成),将依赖项添加到pom.xml(完成)并将POJOMappingFeature添加到web.xml(完成),但我仍然无法使用 JSON 进出服务器访问 Restful Web 服务。

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

【问题讨论】:

  • 您是否忘记在服务方法中包含 HTTP 动词,或者您在实际代码中也没有?
  • 更新问题...它是在代码中,而不是在复制/粘贴中

标签: java json jersey http-status-code-415


【解决方案1】:

您似乎缺少 JacksonJsonProvider.class 用于编组和解组,可以在 jackson-core-asl-1.9.2.jar 中找到

【讨论】:

    【解决方案2】:

    您可能需要添加一个 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

    【讨论】:

      【解决方案3】:

      尝试将Genson library 添加到您的类路径中。 它是一个在 java 和 json 之间进行转换的 java 库。它适用于泽西岛。你只需要将 jar 放到你的类路径中。

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题,在 RequestInfo 中将 @XmlElement 更改为 @XmlRootElement 解决了我的问题。

        import javax.xml.bind.annotation.XmlRootElement;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-21
          • 2017-05-03
          • 2017-08-26
          • 2023-03-24
          • 1970-01-01
          • 1970-01-01
          • 2013-08-13
          • 1970-01-01
          相关资源
          最近更新 更多