使用CXF开发RESTFul接口,接口泛型参数转json的问题
CXF版本 2.7.4,Json provider 使用的org.codehaus.jackson,版本1.9.9
现在遇到的问题:每次调用父接口方法时都会报如下错误,请问有人知道怎么解决吗?
Caused by: org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.io.Serializable, problem: abstract types can only be instantiated with additional type information
at [Source: {"employee_ID":null,"employee_No":"aaa","employee_Name":"aaa"}; line: 1, column: 1]
at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)
at org.codehaus.jackson.map.deser.StdDeserializationContext.instantiationException(StdDeserializationContext.java:233)
at org.codehaus.jackson.map.deser.AbstractDeserializer.deserialize(AbstractDeserializer.java:60)
at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2704)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1315)
at org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:419)
at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBodyReader(JAXRSUtils.java:1196)
at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1144)
at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:695)
at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:655)
at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:238)
... 33 more
代码如下:
public interface ParentWebService<V extends Serializable> { @POST @Path("/add/") @Consumes({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML}) Response insert(V vo) throws ApplicationException; @PUT @Path("/update/") @Consumes({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML}) Response update(V vo) throws ApplicationException; @DELETE @Path("/delete/{id}") @Consumes({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML}) Response delete(@PathParam("id") String id) throws ApplicationException; }
public abstract class ParentWebServiceImpl<V extends Serializable> implements ParentWebService<V> { protected abstract ParentApplication<V> getApplication(); @Override public Response insert(V vo) { int result = getApplication().add(vo); return Response.ok(result).build(); } @Override public Response update(V vo) { int result = getApplication().modify(vo); return Response.ok(result).build(); } @Override public Response delete(String id) { getApplication().delete(id); return Response.ok().build(); } }
@Produces( { MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML }) @Path("/emp") public interface EmployeeWebService extends CommonWebService<EmployeeVO> { } /* 实现类比较简单,省略,只实现ParentWebServiceImpl.getApplication() */
@XmlRootElement(name = "EmployeeVO") @JsonIgnoreProperties(ignoreUnknown=true) public class EmployeeVO implements Serializable { private static final long serialVersionUID = 1L; private Integer employee_ID; private String employee_No; private String employee_Name; /* getter setter 省略 */ }
cxf 配置文件如下:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:http="http://cxf.apache.org/transports/http/configuration" xmlns:util="http://www.springframework.org/schema/util" xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:cxf="http://cxf.apache.org/core" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd" default-autowire="byName"> <!-- all application configure should configure in this file --> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <!-- JSON PROVIDER --> <bean id="jacksonJaxbJsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider" /> <bean id="jacksonJsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" /> <cxf:bus> <cxf:features> <bean class="org.apache.cxf.transport.common.gzip.GZIPFeature" /> </cxf:features> </cxf:bus> <http:conduit name="*.http-conduit"> <http:client AllowChunking="false" ConnectionTimeout="60000" /> </http:conduit> <jaxrs:server id="server" address="/services"> <jaxrs:serviceBeans> <ref bean="employeeWebService" /> </jaxrs:serviceBeans> <jaxrs:providers> <ref bean="jacksonJsonProvider" /> </jaxrs:providers> </jaxrs:server> </beans>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
谢谢先。 感觉不是Null的问题,我现在把ParentWebService改为ParentWebService<V>,去掉了Serializable,程序就正常了,不算真正解决,暂时先这么做了
你这里有个Null值,泛类型就不能正确解析它,因为不知道具体要实现为什么类型,所有会出错。如果知道具体格式,最好是用固定类去解析json。