代码之家  ›  专栏  ›  技术社区  ›  M A.

无法使用jersey(Jackson)将对象解析为JSON

  •  0
  • M A.  · 技术社区  · 7 年前

    我要面对 MessageBodyProviderNotFoundException 同时将JAX-RS服务作为JSON使用。当服务的返回类型为String时,它是有效的,但如果我将其类型更改为any,它就不起作用 Object 或 Response .

    我在谷歌上搜索并尝试了stack overflow或任何其他博客上发布的所有可能的解决方案,但仍然无法解决它。

    例外情况:

    Aug 05, 2019 5:29:50 PM org.apache.catalina.core.StandardWrapperValve invoke
    SEVERE: Servlet.service() for servlet [com.muneeb] in context with path [/AddressBookAPI] threw exception [org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class com.muneeb.entities.User, genericType=class com.muneeb.entities.User.] with root cause
    org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class com.muneeb.entities.User, genericType=class com.muneeb.entities.User.
        at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:191)
        at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139)
        at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:103)
        at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139)
        at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:88)
        at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139)
        at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1005)
        at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:515)
        at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:362)
        at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:352)
        at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:240)
        at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
        at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
    

    这是人工制品的代码。

    @Path("/users")
    public class UserResource {
    
        @GET
        @Path("/getUsers")
        @Produces(MediaType.APPLICATION_JSON)
        public User getAll(){
            User user1 = new User("Jersey", "glassfish", 2, null, null, 1234);
            return user1;
        }
    }
    

    使用者JAVA

    public class User {
    
        private String fName;
        private String lName;
        private Integer age;
        private List<Address> addresses;
        private List<Phone> phones;
        private long pin;
    
        public User() {}
    
        ..... getters and setters
    

    注册Jackson模块

    @ApplicationPath("/api")
    public class AddressBookAPI extends Application{
    
        @Override
        public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = new HashSet<Class<?>>();
            classes.add(JacksonFeature.class);
            return classes;
        }
    }
    

    还有谁能告诉我 "/api" 在上面的ApplicationPath注释中?除了这个,我还能提供什么吗 “/api”

    这里是网络。xml

    <web-app>
      <display-name>Archetype Created Web Application</display-name>
    
      <servlet>
            <servlet-name>com.muneeb</servlet-name>
            <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    
            <init-param>
                <param-name>jersey.config.server.provider.packages</param-name>
                <param-value>com.muneeb.rest</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
      </servlet>
    
      <servlet-mapping>
            <servlet-name>com.muneeb</servlet-name>
            <url-pattern>/rest/*</url-pattern>
      </servlet-mapping>
    </web-app>
    

    波姆。xml

    [INFO] com.muneeb.rest:AddressBookAPI:war:1.0-SNAPSHOT
    [INFO] +- junit:junit:jar:3.8.1:test
    [INFO] +- javax.ws.rs:javax.ws.rs-api:jar:2.0.1:compile
    [INFO] +- org.glassfish.jersey.media:jersey-media-json-jackson:jar:2.2:compile
    [INFO] |  +- org.glassfish.jersey.core:jersey-common:jar:2.2:compile
    [INFO] |  |  +- javax.annotation:javax.annotation-api:jar:1.2:compile
    [INFO] |  |  \- org.glassfish.hk2:osgi-resource-locator:jar:1.0.1:compile
    [INFO] |  +- org.codehaus.jackson:jackson-core-asl:jar:1.9.11:compile
    [INFO] |  +- org.codehaus.jackson:jackson-mapper-asl:jar:1.9.11:compile
    [INFO] |  +- org.codehaus.jackson:jackson-jaxrs:jar:1.9.11:compile
    [INFO] |  \- org.codehaus.jackson:jackson-xc:jar:1.9.11:compile
    [INFO] +- org.glassfish.jersey.core:jersey-server:jar:2.2:compile
    [INFO] |  +- org.glassfish.jersey.core:jersey-client:jar:2.2:compile
    [INFO] |  +- com.google.guava:guava:jar:14.0.1:compile
    [INFO] |  +- org.glassfish.hk2:hk2-api:jar:2.2.0-b14:compile
    [INFO] |  |  \- org.glassfish.hk2:hk2-utils:jar:2.2.0-b14:compile
    [INFO] |  +- org.glassfish.hk2.external:javax.inject:jar:2.2.0-b14:compile
    [INFO] |  +- org.glassfish.hk2:hk2-locator:jar:2.2.0-b14:compile
    [INFO] |  |  +- org.glassfish.hk2.external:asm-all-repackaged:jar:2.2.0-b14:compile
    [INFO] |  |  \- org.glassfish.hk2.external:cglib:jar:2.2.0-b14:compile
    [INFO] |  \- javax.validation:validation-api:jar:1.1.0.Final:compile
    [INFO] +- org.glassfish.jersey.containers:jersey-container-servlet:jar:2.2:compile
    [INFO] |  \- org.glassfish.jersey.containers:jersey-container-servlet-core:jar:2.2:compile
    [INFO] \- javax.servlet:javax.servlet-api:jar:3.1.0:provided
    
    0 回复  |  直到 7 年前