在WLP 8.5.5.8上运行的JAX-RS应用程序中发布JSON时引发异常
我有一个非常简单的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”是数组,则会引发相同的错误:在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
{
"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?