2014-02-22 97 views
3

我想创建一个简单的web服务,它使用json输出,但没有得到所需的Json输出。用泽西和Jaxb自定义Json输出

POJO: package com.rest.resource;

import java.io.Serializable; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

    @XmlRootElement 
    @XmlAccessorType(XmlAccessType.FIELD) 
    public class Track implements Serializable 
     { 

     @XmlElement 
     String singer = "ABC"; 
     @XmlElement 
     String title = "XYZ"; 
     } 

服务:

import javax.ws.rs.Consumes; 
import javax.ws.rs.GET; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 
import javax.xml.bind.JAXBException; 
import com.rest.resource.Track; 

@Path("/json/metallica") 
public class JSONService 
    { 

    @POST 
    @Path("/post") 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    public Track createTrackInJSON(final Track track) 
     { 
     return track; 
     } 

    @GET 
    @Path("/get") 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response getTrackInJSON() throws JAXBException 
     { 
     final Track track = new Track(); 
     return Response.status(201).entity(track).build(); 
     } 

    } 

打开/让我得到

{ “歌手”: “ABC”, “称号”: “XYZ”}

但我想“ track“:{”singer“:”ABC“,”title“:”XYZ“} 我无法打印根元素。

我试过使用CustomJAXBContextResolver类,但没有为我工作?任何人都可以举一个相同的例子吗?

回答

3

如果你想使用ContextResolver,你需要使用JSONConfiguration并切换JSON表示法。你可以做,通过添加这样的类:

@Provider 
public class MyJAXBContextProvider implements ContextResolver<JAXBContext> { 

    private JSONJAXBContext trackCtx; 

    public MyJAXBContextProvider() throws JAXBException { 
     trackCtx = new JSONJAXBContext(JSONConfiguration.mappedJettison().build(), Track.class); 
    } 

    public JAXBContext getContext(Class<?> type) { 
     if(type == Track.class) { 
      return trackCtx; 
     } 

     return null; 
    } 

} 

增加生产这种该类对我来说:

{"track":{"singer":"ABC","title":"XYZ"}}

欲了解更多信息请查看新泽西Docs

+0

时使用它嘿,这对于获取请求非常有效,但发布请求失败。 你有什么想法,我应该调整? – user1552879

1

你不得不换Track与其他对象:

public class TrackWrapper { 
    Track track; 
    TrackWrapper(Track track) { 
    this.track=track; 
    } 
} 

,并返回TrackWrapper一个实例,

@GET 
@Path("/get") 
@Produces(MediaType.APPLICATION_JSON) 
public Response getTrackInJSON() throws JAXBException 
    { 
    final TrackWrapper trackWrapper = new TrackWrapper(new Track()); 
    return Response.status(201).entity(trackWrapper).build(); 
    } 

} 

以防万一,如果你只是要去使用JSON你不需要JAXB注释。

+0

这是一个很好的解决方案并感谢您的回答,但还有什么我可以做的吗? 我正在读一些关于 - CustomJaxbContexResolver等,但无法使它为我工作。 你的解决方案确实解决了这个问题。 – user1552879

+0

嘿,我应该使用哪种注释 – user1552879

+0

球衣默认使用jackson作为JSON处理库,下面是杰克逊的参考资料:http://fasterxml.github.io/jackson-databind/javadoc/2.1.0/ – Camilo