如何在jax-rs中的post请求中处理Json主体

时间:2013-01-21 10:25:56

标签: json jaxb jersey jax-rs restful-architecture

我有一个关于JAX-RS的项目(作业)。我正在使用NetBeans,Jersey和Tomcat。

enter image description here

这是我系统中主要对象的“用户”类。

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="user")
public class User {

    //@XmlElement
    //public int id ;
    @XmlElement
    public String username;
    @XmlElement
    public String fullname;
    @XmlElement
    public String gender;
    @XmlElement
    public String birthDate;

    public User(){

    }

    public User(String username,String fullname, String gender,String birthDate){

        //this.id = id;
        this.username = username;
        this.fullname = fullname;
        this.gender = gender;
        this.birthDate = birthDate;
    }

}

这是我的“JAXBContextResolver”类

import com.sun.jersey.api.json.JSONConfiguration;
import com.sun.jersey.api.json.JSONJAXBContext;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import javax.xml.bind.JAXBContext;


@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext>{

    private JAXBContext context;
    private Class[] types = {User.class};


    public JAXBContextResolver() throws Exception {

        this.context = 
        new JSONJAXBContext(  JSONConfiguration.mapped().build(), types); 
    }

    @Override
    public JAXBContext getContext(Class<?> objectType) {
         for (Class type : types) {
             if (type == objectType) {
                 return context;
             }
         }

        return null;

    }

}

这是我在“UserService”类中的post方法

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON) 
    public List<User> createNewUser(User tUser)  {
        List<User> list = new ArrayList<User>();

        list.add(tUser);



        return list;
    }

当我在使用RESTClient(Firefox附加组件)的localhost中尝试发布新用户时,我的请求正文是这样的json输入:

{"user":{"username":"blabla","fullname":"blabla","gender":"M","birthDate":"05.01.1978"}}

在post方法(在UserService类中)必须变量“tUser”自动填充即将到来的输入? “tUser”变量在调试模式中显示空元素,如:

enter image description here

如果我知道错误,有人可以纠正我吗?为什么这个值显示为null?他们不能显示“blabla” - “blabla” - “M” - “05.01.1878”?你能帮帮我吗?

2 个答案:

答案 0 :(得分:2)

我解决了这个问题;在JAXBContextResolver类中,我改变了这样的方法:

public JAXBContextResolver() throws Exception {

        this.context = 
        new JSONJAXBContext(  JSONConfiguration.mapped().rootUnwrapping(false).build(), types); 
}

与第一个的区别在于添加“rootUnwrapping(false)”表达式。

答案 1 :(得分:0)

@XmlRootElement在您的示例中不起作用。发送

{"username":"blabla","fullname":"blabla","gender":"M","birthDate":"05.01.1978"}  

代替
修改
1)

public List<User> createNewUser(Request tUser)  

和班级

class Request
{
   public User user;
}  

2)

public List<User> createNewUser(String tUser)  

并使用Stringgoogle-gson

jackson json processor转换为对象