Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JAX-RS上返回JSON而不带父标记?_Java_Json_Jax Rs_Liferay - Fatal编程技术网

Java 如何在JAX-RS上返回JSON而不带父标记?

Java 如何在JAX-RS上返回JSON而不带父标记?,java,json,jax-rs,liferay,Java,Json,Jax Rs,Liferay,我正在尝试为Liferay创建一个RESTAPI模块,但在尝试从Web服务生成JSON响应时遇到了问题 我想生成一个简单的JSON,如下所示: { "status": "ok", "message": "News not found for ID: 5" } 但事实上,我得到的是: { "parentResponse": { "status": "ok", "message": "News not found for ID: 5"

我正在尝试为Liferay创建一个RESTAPI模块,但在尝试从Web服务生成JSON响应时遇到了问题

我想生成一个简单的JSON,如下所示:

{
    "status": "ok",
    "message": "News not found for ID: 5"
}
但事实上,我得到的是:

{
    "parentResponse": {
        "status": "ok",
        "message": "News not found for ID: 5"
    }
}
这是我的POJO课程:

@XmlRootElement
public class ParentResponse {

    public String status, message;
    public Object item;

    public ParentResponse() {

    }

    public ParentResponse(String status, String message, Object item) {
        this.status = status;
        this.message = message;
        this.item = item;
    }   
}
返回json的My webservice:

// return a single news based on supplied ID
    @GET
    @Path("{id}")
    @Produces("application/json")
    public Response getNewsById(@PathParam("id") String id) {
        ResponseBuilder builder;
        try {
            News news = findById(new Long(id));
            if (news != null) {
                builder = Response.ok(news);
            } 
            else { // This is my POJO class returned as a JSON
                ParentResponse parentResponse = new ParentResponse("ok", "News not found for ID: " + id, null);

                builder = Response.status(Response.Status.NOT_FOUND).entity(parentResponse);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return builder.build();
    }

那么,如何在没有根标记的情况下获得JSON呢?我尝试在@XmlRootElement注释旁边添加(name=“”),但没有成功。

我建议您使用jackson provider对json输入/输出进行编组/解编组(正如我在您的帖子评论中所做的那样):

您的模型应如下所示:

@JsonInclude(JsonInclude.Include.NON_EMPTY) 
public class ParentResponse { 

  @JsonProperty("message") 
  public String message; 

  @JsonProperty("status") 
  public String status; 

//... 

}
如果您使用Liferay 7,我还建议您利用OSGi,创建一个调用您的服务端点的服务(
Response getNewsById(@PathParam(“id”)String id)
)。当您的OSGi服务启动时,它应该设置jackson提供者并设置web服务端点url。。。以及初始化您的服务的任何其他内容


@Component(immediate = false)
public class WonderfulOsgiService{

    private MyWebService myWebService;

    public Response getNews( String id) {
        return myWebService.getNewsById(id);
    }


    @Activate
    @Modified
    private void activate(Map<String, Object> config) {
        // Creates jackson provider for marshalling/unmarshalling json
        ObjectMapper myMapper = new ObjectMapper();
        myMapper.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE);
        JacksonJsonProvider provider = new JacksonJsonProvider(myMapper);
        provider.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        List<Object> providers = new ArrayList<>();
        providers.add(provider);


        //web service endpoint address
        String address = "http://my-web-service-address.com/url/"
        //MyWebService is the class containing getNewsById(id)
        myWebService = JAXRSClientFactory.create(address, MyWebService.class, providers);   

    }

@组件(立即=假)
公共类WonderfulOsgiService{
私有MyWebService MyWebService;
公共响应getNews(字符串id){
返回myWebService.getNewsById(id);
}
@激活
@修改
私有void激活(映射配置){
//创建用于编组/解编组json的jackson提供程序
ObjectMapper myMapper=新建ObjectMapper();
启用(反序列化功能。使用默认值读取未知枚举值);
JacksonJsonProvider provider=新的JacksonJsonProvider(myMapper);
configure(在未知属性上反序列化feature.FAIL,false);
列表提供程序=新的ArrayList();
提供者。添加(提供者);
//web服务端点地址
字符串地址=”http://my-web-service-address.com/url/"
//MyWebService是包含getNewsById(id)的类
myWebService=JAXRSClientFactory.create(地址,myWebService.class,提供者);
}

我建议您使用jackson provider对json输入/输出进行编组/解编组(正如我在您的帖子评论中所做的):

您的模型应如下所示:

@JsonInclude(JsonInclude.Include.NON_EMPTY) 
public class ParentResponse { 

  @JsonProperty("message") 
  public String message; 

  @JsonProperty("status") 
  public String status; 

//... 

}
如果您使用Liferay 7,我还建议您利用OSGi,创建一个调用您的服务端点的服务(
Response getNewsById(@PathParam(“id”)String id)
)。当您的OSGi服务启动时,它应该设置jackson提供程序并设置web服务端点url…以及其他任何东西来初始化您的服务


@Component(immediate = false)
public class WonderfulOsgiService{

    private MyWebService myWebService;

    public Response getNews( String id) {
        return myWebService.getNewsById(id);
    }


    @Activate
    @Modified
    private void activate(Map<String, Object> config) {
        // Creates jackson provider for marshalling/unmarshalling json
        ObjectMapper myMapper = new ObjectMapper();
        myMapper.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE);
        JacksonJsonProvider provider = new JacksonJsonProvider(myMapper);
        provider.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        List<Object> providers = new ArrayList<>();
        providers.add(provider);


        //web service endpoint address
        String address = "http://my-web-service-address.com/url/"
        //MyWebService is the class containing getNewsById(id)
        myWebService = JAXRSClientFactory.create(address, MyWebService.class, providers);   

    }

@组件(立即=假)
公共类WonderfulOsgiService{
私有MyWebService MyWebService;
公共响应getNews(字符串id){
返回myWebService.getNewsById(id);
}
@激活
@修改
私有void激活(映射配置){
//创建用于编组/解编组json的jackson提供程序
ObjectMapper myMapper=新建ObjectMapper();
启用(反序列化功能。使用默认值读取未知枚举值);
JacksonJsonProvider provider=新的JacksonJsonProvider(myMapper);
configure(在未知属性上反序列化feature.FAIL,false);
列表提供程序=新的ArrayList();
提供者。添加(提供者);
//web服务端点地址
字符串地址=”http://my-web-service-address.com/url/"
//MyWebService是包含getNewsById(id)的类
myWebService=JAXRSClientFactory.create(地址,myWebService.class,提供者);
}

如果您正在使用Liferay 7.1和CXF的抛弃支持,您可以通过向
/configs
目录添加配置文件来配置它:

org.apache.aries.jax.rs.jaxb.json.cfg
内容包括:

drop.collection.wrapper.element=true
drop.root.element=true
serialize.as.array=true
support.unwrapped=true
从Liferay 7.2开始,Liferay附带Jackson作为默认JAXB提供程序

请注意,Liferay中的OSGi JAX-RS白板支持允许您切换JSON提供程序,而无需更改应用程序的代码

或者如何在Liferay中提供jackson支持(如果不在7.2中,则包括在内)以及以下依赖项:


只需确保更换CXF抛弃组件,这可能会对依赖它的其他捆绑包产生副作用。

如果您使用带有CXF抛弃支持的Liferay 7.1,您可以通过向
/configs
目录添加配置文件来配置:

org.apache.aries.jax.rs.jaxb.json.cfg
内容包括:

drop.collection.wrapper.element=true
drop.root.element=true
serialize.as.array=true
support.unwrapped=true
从Liferay 7.2开始,Liferay附带Jackson作为默认JAXB提供程序

请注意,Liferay中的OSGi JAX-RS白板支持允许您切换JSON提供程序,而无需更改应用程序的代码

或者如何在Liferay中提供jackson支持(如果不在7.2中,则包括在内)以及以下依赖项:


只需确保替换CXF抛弃包,这可能会对依赖它的其他捆绑包产生副作用。

您不尝试使用jackson来整理bean的内容是什么?如何将其添加到我的项目的build.gradle文件中?我尝试添加以下内容:compileInclude组:'com.fasterxml.jackson.core',名称:'jackson core',但没有工作。尝试在模块的build.gradle中添加以下行:
compile”com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.9.0“compile”com.fasterxml.jackson.core:jackson-annotations:2.9.0“
谢谢@javaxiss,它似乎可以工作。但是现在,我该怎么办呢?您应该在模型属性上使用
@JsonProperty
(ParentResponse)如下:
@JsonInclude(JsonInclude.Include.NON_EMPTY)公共类ParentResponse{@JsonProperty(“message”)公共字符串message;@JsonProperty(“status”)公共字符串status;…}
您不尝试使用jackson进行编组的内容