首页 > 解决方案 > 使用 MessageBodyReader 时,面对来自 JAX-RS 客户端的 HTTP 415 Unsupported Media Type

问题描述

我是 JAX-RS 和学习的 RESTFul 新手。只有当我从 JAX-RS 客户端应用程序请求时,我才会遇到问题。它在帖子插件中工作正常。但是当我用“application/xml”改变@Consumes(“myformat/xml”)时,它就可以工作了。下面是代码。

消息体阅读器:

package com.memorynotfound.jaxrs.chunked;

import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import javax.ws.rs.Consumes;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.Provider;

@Provider
@Consumes("myformat/xml")
public class UserMessageBodyReader implements MessageBodyReader<User> {

    public boolean isReadable(Class<?> arg0, Type arg1, Annotation[] arg2, MediaType arg3) {

        if (arg0.equals(User.class))
            return true;
        else
            return false;
    }

    public User readFrom(Class<User> arg0, Type arg1, Annotation[] arg2, MediaType arg3,
            MultivaluedMap<String, String> arg4, InputStream arg5) throws IOException, WebApplicationException {
        return new User(1, "Jphn Doe");
    }

}

资源:

package com.memorynotfound.jaxrs.chunked;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;

@Path("/users")
public class UserResource {

    @POST
    @Consumes("myformat/xml")
    public User getUser(User user) {
        return user;
    }

}

客户端代码:

package com.restfulexample.client.messagebodyreader;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;

public class MessageBodyReader {

    public static void main(String[] args) {

        Client client = ClientBuilder.newClient();

        User user = new User(1, "Jphn Doe");
        User postedUser = client.target("http://localhost:9090/message-body-reader/api/users").request("myformat/xml")
                .post(Entity.xml(user), User.class);

        System.out.println(postedUser.getId() + " " + postedUser.getName());
    }
}

标签: restjax-rs

解决方案


使用以下代码找到解决方案...

客户端客户端 = ClientBuilder.newClient().register(UserMessageBodyReader.class) .register(UserMessageBodyWriter.class);

我们必须向客户端注册 MessageBodyReader 和 Writer。


推荐阅读