Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
在WLP 8.5.5.8上运行的JAX-RS应用程序中发布JSON时引发异常_Json_Jax Rs_Websphere Liberty - Fatal编程技术网

在WLP 8.5.5.8上运行的JAX-RS应用程序中发布JSON时引发异常

在WLP 8.5.5.8上运行的JAX-RS应用程序中发布JSON时引发异常,json,jax-rs,websphere-liberty,Json,Jax Rs,Websphere Liberty,我有一个非常简单的Java应用程序,使用JAX-RS,运行在WLP 8.5.5.8上。当我发布复合结构的JSON时,会出现以下错误: [错误]错误处理过程中发生错误,请放弃!无效类型 有价值的。类型:[java.util.LinkedHashMap],值:[{d=e}][ERROR ]SRVE0777E:应用程序类引发的异常 'org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage:116' java.la

我有一个非常简单的Java应用程序,使用JAX-RS,运行在WLP 8.5.5.8上。当我发布复合结构的JSON时,会出现以下错误:

[错误]错误处理过程中发生错误,请放弃!无效类型 有价值的。类型:[java.util.LinkedHashMap],值:[{d=e}][ERROR ]SRVE0777E:应用程序类引发的异常 'org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage:116' java.lang.RuntimeException:org.apache.cxf.interceptor.Fault:无效 值的类型。键入:[java.util.LinkedHashMap],值:[{d=e}] 在 org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:116) 在[内部类]处,由以下原因引起:org.apache.cxf.interceptor.Fault: 无效的值类型。类型:[java.util.LinkedHashMap],值为: [{d=e}]at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:76) ... 1其他原因:java.lang.IllegalArgumentException:无效 值的类型。键入:[java.util.LinkedHashMap],值:[{d=e}] 在com.ibm.json.java.JSONObject.put(JSONObject.java:241)上。。。还有一个

当我对资源进行POST时,json对象包含json数组或json对象的属性,在到达函数之前抛出异常

导致这种情况的JSON示例(如果我删除“c”属性,它就可以正常工作):

如果“c”是数组,则会引发相同的错误:

{
    "a": "b",
    "c": [
        {"d": "e"},
        {"d": "f"},
        {"d": "g"}
    ]
}
我没有添加任何我自己的LIB,所有内容都包含在WLP中。如果我在WLP 8.5.5.3上运行这个示例,它可以正常工作。因为我发现很难相信这个简单的示例暴露了一个缺陷,所以我遗漏了什么

这是我的资源:

rootresource.java

package com.sample;

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 com.ibm.json.java.JSONObject;

@Path("/hello")
public class RootResource {

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response postTest(JSONObject json) {
        return Response.ok(json).build();
    }
}
这是我的应用程序:

package com.sample;

import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;

public class MyApp extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> s = new HashSet<Class<?>>();
        s.add(RootResource.class);
        return s;
    }
}
package.com.sample;
导入java.util.HashSet;
导入java.util.Set;
导入javax.ws.rs.core.Application;
公共类MyApp扩展应用程序{
@凌驾
public Set>s=新哈希集
简单测试服务
样品
样品
com.ibm.websphere.jaxrs.server.IBMRestServlet
javax.ws.rs.Application
com.sample.MyApp
1.
真的
假的
样品
/*
简单测试

进一步查看所提供的代码,我在异常中看到了这一点:

    Caused by: java.lang.IllegalArgumentException: Invalid type of value.  Type: [java.util.LinkedHashMap] with value: [{d=e}]
at com.ibm.json.java.JSONObject.put(JSONObject.java:241)
at org.codehaus.jackson.map.deser.MapDeserializer._readAndBind(MapDeserializer.java:244)
at org.codehaus.jackson.map.deser.MapDeserializer.deserialize(MapDeserializer.java:166)
at org.codehaus.jackson.map.deser.MapDeserializer.deserialize(MapDeserializer.java:24)
at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:1961)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:889)
at org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:410)
at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBodyReader(JAXRSUtils.java:1356)
at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1307)
at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:847)
at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:810)
at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:255)
at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:85)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307
也许默认的json提供程序在jax rs 1.1和2.0之间发生了更改?使用Jackson将请求数据反序列化为json4j对象的过程并不顺利。将提供程序设置为这样似乎可以让它正常工作:

    import com.ibm.websphere.jaxrs.providers.json4j.JSON4JArrayProvider;
    import com.ibm.websphere.jaxrs.providers.json4j.JSON4JObjectProvider;

    public class MyApp extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> s = new HashSet<Class<?>>();
        s.add(RootResource.class);
        s.add(JSON4JObjectProvider.class);
        s.add(JSON4JArrayProvider.class);
        return s;
    }
import com.ibm.websphere.jaxrs.providers.json4j.JSON4JArrayProvider;
导入com.ibm.websphere.jaxrs.providers.json4j.JSON4JObjectProvider;
公共类MyApp扩展应用程序{
@凌驾

public Set>s=new HashSet进一步查看提供的代码,我在异常中看到了这一点:

    Caused by: java.lang.IllegalArgumentException: Invalid type of value.  Type: [java.util.LinkedHashMap] with value: [{d=e}]
at com.ibm.json.java.JSONObject.put(JSONObject.java:241)
at org.codehaus.jackson.map.deser.MapDeserializer._readAndBind(MapDeserializer.java:244)
at org.codehaus.jackson.map.deser.MapDeserializer.deserialize(MapDeserializer.java:166)
at org.codehaus.jackson.map.deser.MapDeserializer.deserialize(MapDeserializer.java:24)
at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:1961)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:889)
at org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:410)
at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBodyReader(JAXRSUtils.java:1356)
at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1307)
at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:847)
at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:810)
at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:255)
at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:85)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307
也许默认的json提供程序在jax rs 1.1和2.0之间发生了更改?使用Jackson将请求数据反序列化为json4j对象的过程并不顺利。将提供程序设置为这样似乎可以让它正常工作:

    import com.ibm.websphere.jaxrs.providers.json4j.JSON4JArrayProvider;
    import com.ibm.websphere.jaxrs.providers.json4j.JSON4JObjectProvider;

    public class MyApp extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> s = new HashSet<Class<?>>();
        s.add(RootResource.class);
        s.add(JSON4JObjectProvider.class);
        s.add(JSON4JArrayProvider.class);
        return s;
    }
import com.ibm.websphere.jaxrs.providers.json4j.JSON4JArrayProvider;
导入com.ibm.websphere.jaxrs.providers.json4j.JSON4JObjectProvider;
公共类MyApp扩展应用程序{
@凌驾

public Set>s=new hashset如果这在8.5.5.3上有效,那么我假设您使用的是jaxrs-1.1功能。从8.5.5.8上的堆栈来看,您似乎使用的是jaxrs-2.0。如果您返回到使用jaxrs-1.1,它是否像以前一样工作?您需要使用jaxrs-2.0吗?如果这在8.5.5.3上有效,那么我假设您使用的是jaxrs-1.1功能。从8.5.3上的堆栈来看.5.5.8您似乎正在使用jaxrs-2.0。如果您重新使用jaxrs-1.1,它是否像以前一样工作?您是否需要使用jaxrs-2.0?