Java resteasy与dsl json集成-无法注册读卡器
我正在尝试将dsl json与resteasy集成以进行反序列化/序列化,但它引发了一个异常Java resteasy与dsl json集成-无法注册读卡器,java,json,rest,resteasy,dsl,Java,Json,Rest,Resteasy,Dsl,我正在尝试将dsl json与resteasy集成以进行反序列化/序列化,但它引发了一个异常 java.io.IOException: Unable to find reader for provided type: class com.x.y.api.v1.resource.A and fallback serialization is not registered. 17:04:51,705 ERROR [stderr] (default task-2) Found reader for:
java.io.IOException: Unable to find reader for provided type: class com.x.y.api.v1.resource.A and fallback serialization is not registered.
17:04:51,705 ERROR [stderr] (default task-2) Found reader for: class com.x.y.api.v1.resource.A so try deserializing into that instead?
17:04:51,705 ERROR [stderr] (default task-2) Alternatively, try initializing system with custom fallback or register specified type using registerReader into class com.dslplatform.json.DslJson
17:04:51,705 ERROR [stderr] (default task-2) at com.dslplatform.json.DslJson.showErrorMessage(DslJson.java:650)
17:04:51,706 ERROR [stderr] (default task-2) at com.dslplatform.json.DslJson.deserialize(DslJson.java:980)
17:04:51,706 ERROR [stderr] (default task-2) at com.x.y.provider.DSLJsonProvider.readFrom(DSLJsonProvider.java:41)
17:04:51,706 ERROR [stderr] (default task-2) at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.readFrom(AbstractReaderInterceptorContext.java:61)
17:04:51,706 ERROR [stderr] (default task-2) at org.jboss.resteasy.core.interception.ServerReaderInterceptorContext.readFrom(ServerReaderInterceptorContext.java:60)
17:04:51,706 ERROR [stderr] (default task-2) at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:53)
17:04:51,707 ERROR [stderr] (default task-2) at org.jboss.resteasy.security.doseta.DigitalVerificationInterceptor.aroundReadFrom(DigitalVerificationInterceptor.java:34)
17:04:51,707 ERROR [stderr] (default task-2) at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:55)
17:04:51,707 ERROR [stderr] (default task-2) at org.jboss.resteasy.plugins.interceptors.encoding.GZIPDecodingInterceptor.aroundReadFrom(GZIPDecodingInterceptor.java:59)
17:04:51,707 ERROR [stderr] (default task-2) at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:55)
17:04:51,707 ERROR [stderr] (default task-2) at org.jboss.resteasy.core.MessageBodyParameterInjector.inject(MessageBodyParameterInjector.java:151)
17:04:51,708 ERROR [stderr] (default task-2) at org.jboss.resteasy.core.MethodInjectorImpl.injectArguments(MethodInjectorImpl.java:91)
17:04:51,708 ERROR [stderr] (default task-2) at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:114)
17:04:51,708 ERROR [stderr] (default task-2) at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:295)
17:04:51,708 ERROR [stderr] (default task-2) at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:249)
17:04:51,708 ERROR [stderr] (default task-2) at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:236)
17:04:51,709 ERROR [stderr] (default task-2) at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:395)
17:04:51,709 ERROR [stderr] (default task-2) at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:202)
17:04:51,709 ERROR [stderr] (default task-2) at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:221)
17:04:51,710 ERROR [stderr] (default task-2) at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
17:04:51,710 ERROR [stderr] (default task-2) at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
我的DSLJsonProvider类如下所示
package com.x.y.provider;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;
import com.dslplatform.json.DslJson;
import com.dslplatform.json.JsonReader;
import com.dslplatform.json.JsonReader.ReadObject;
import com.dslplatform.json.JsonWriter;
@SuppressWarnings("rawtypes")
@Provider
@Consumes({MediaType.APPLICATION_JSON, "text/json"})
@Produces({MediaType.APPLICATION_JSON, "text/json"})
public class DSLJsonProvider extends DslJson implements MessageBodyWriter, MessageBodyReader {
@Override
public boolean isReadable(Class type, Type genericType, Annotation[] annotations,
javax.ws.rs.core.MediaType mediaType) {
return true;
}
@SuppressWarnings("unchecked")
@Override
public Object readFrom(Class type, Type genericType, Annotation[] annotations, javax.ws.rs.core.MediaType mediaType,
MultivaluedMap httpHeaders, InputStream entityStream) throws IOException, WebApplicationException {
DslJson<Object> dslJson = new DslJson<Object>();
try {
dslJson.registerReader(type,null);//Here I need help
return dslJson.deserialize(type, entityStream, new byte[1024]);
} catch (Exception e) {
e.printStackTrace();
} finally {
entityStream.close();
}
return null;
}
@Override
public boolean isWriteable(Class type, Type genericType, Annotation[] annotations,
javax.ws.rs.core.MediaType mediaType) {
return true;
}
@Override
public long getSize(Object t, Class type, Type genericType, Annotation[] annotations,
javax.ws.rs.core.MediaType mediaType) {
return -1;
}
@Override
@SuppressWarnings("resource")
public void writeTo(Object t, Class type, Type genericType, Annotation[] annotations,
javax.ws.rs.core.MediaType mediaType, MultivaluedMap httpHeaders, OutputStream entityStream)
throws IOException, WebApplicationException {
JsonWriter writer = new JsonWriter();
try {
//Need help to register writer
writer.toStream(entityStream);
} catch (Exception e) {
e.printStackTrace();
}
}
}
包com.x.y.provider;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.OutputStream;
导入java.lang.annotation.annotation;
导入java.lang.reflect.Type;
导入javax.ws.rs.Consumes;
导入javax.ws.rs.products;
导入javax.ws.rs.WebApplicationException;
导入javax.ws.rs.core.MediaType;
导入javax.ws.rs.core.MultivaluedMap;
导入javax.ws.rs.ext.MessageBodyReader;
导入javax.ws.rs.ext.MessageBodyWriter;
导入javax.ws.rs.ext.Provider;
导入com.dslplation.json.DslJson;
导入com.dslplation.json.JsonReader;
导入com.dslplation.json.JsonReader.ReadObject;
导入com.dslplation.json.JsonWriter;
@抑制警告(“原始类型”)
@提供者
@使用({MediaType.APPLICATION_JSON,“text/JSON”})
@产生({MediaType.APPLICATION_JSON,“text/JSON”})
公共类DSLJsonProvider扩展DslJson实现MessageBodyWriter、MessageBodyReader{
@凌驾
公共布尔值可读取(类类型、类型genericType、注释[]注释、,
javax.ws.rs.core.MediaType(媒体类型){
返回true;
}
@抑制警告(“未选中”)
@凌驾
公共对象读取自(类类型、类型genericType、注释[]注释、javax.ws.rs.core.MediaType MediaType、,
多值Map httpHeaders,InputStream entityStream)引发IOException,WebApplicationException{
DslJson=新的DslJson();
试一试{
registerReader(type,null);//这里我需要帮助
返回dslJson.deserialize(类型,entityStream,新字节[1024]);
}捕获(例外e){
e、 printStackTrace();
}最后{
entityStream.close();
}
返回null;
}
@凌驾
公共布尔值可写(类类型、类型genericType、注释[]注释、,
javax.ws.rs.core.MediaType(媒体类型){
返回true;
}
@凌驾
公共长getSize(对象t、类类型、类型genericType、注释[]注释、,
javax.ws.rs.core.MediaType(媒体类型){
返回-1;
}
@凌驾
@抑制警告(“资源”)
public void writeTo(对象t、类类型、类型genericType、注释[]注释、,
javax.ws.rs.core.MediaType MediaType,多值Map HttpHeader,OutputStream entityStream)
抛出IOException、WebApplicationException{
JsonWriter=新的JsonWriter();
试一试{
//需要帮助注册作者吗
writer.toStream(entityStream);
}捕获(例外e){
e、 printStackTrace();
}
}
}
编辑1:
我的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.x.y</groupId>
<artifactId>project-web</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>project-web</name>
<dependencies>
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-core</artifactId>
<version>1.3.20.Final</version>
</dependency>
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-servlet</artifactId>
<version>1.3.20.Final</version>
</dependency>
<dependency>
<groupId>com.dslplatform</groupId>
<artifactId>dsl-json</artifactId>
<version>0.9.5</version>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.0.16.Final</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson-provider</artifactId>
<version>3.0.16.Final</version>
</dependency>
<dependency>
<groupId>com.dslplatform</groupId>
<artifactId>dsl-json-java8</artifactId>
<version>0.9.7</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<annotationProcessors>
<annotationProcessor>com.dslplatform.json.CompiledJsonProcessor</annotationProcessor>
</annotationProcessors>
</configuration>
</plugin>
</plugins>
</build>
</project>
4.0.0
com.x.y
提前感谢。错误消息说找不到的读取器:com.x.y.api.v1.resource.A
要么是您忘记将@CompiledJson
添加到该类中,要么是由于某种原因,ServiceLoader
没有获取该类
如果您想为JsonReader.ReadObject
注册您自己的阅读器,您可以查看,尽管我认为您可能只想添加注释以便编译器获取它
这些注释的处理器位于一个单独的库(处理器)中,所以大多数情况下您可能没有将其包括在内,或者将其添加为注释处理器
您需要去掉dslJson.registerReader(type,null);因为这将覆盖正确的读卡器
我更新了dsl json自述,因为我偶尔会遇到这样的错误。即:“在启动期间,DslJson通过ServiceLoader加载服务。要使其正常工作,META-INF/services/com.dslplation.json.Configuration必须包含dsl_json.json.ExternalSerialization的内容,该内容是编译步骤中装入的类。在某些情况下,此文件不会复制到APK或相应的jar/war文件。您可以通过在项目中的src/main/resources/META-INF/services下创建这样的文件作为所用包/构建工具的解决方案来解决此问题。”
我对您的设置更感兴趣,因此如果这为您解决了问题,请在存储库中提交一个问题,以便正确解决。我也遇到了同样的问题,并通过向反序列化类添加默认构造函数来解决。谢谢您的回复!我已经为该类准备了@CompiledJson。我已经编辑了该问题,以包含我的问题这是包含注释处理器的正确方法吗?您仍然缺少对处理器的依赖关系(dsl json处理器)。我添加了该依赖项。但仍然不走运。它仍然表示找不到读取器。当我在调试模式中检查时,读取器被传递为null。您知道这是怎么回事吗?谢谢!在DslJson初始化过程中选择了正确的读取器。您可以检查读取器映射以查看是否有内容。如果一切都正确在安装过程中,您的所有@CompiledJson类型都应该在那里。我检查了readers映射。我发现我的@CompiledJson类型都不存在。我在“jsonReaders”映射中只看到默认类型,在“jsonObjectReaders”映射中看到“{}”。此外,我还看到了回退和上下文也为null。我无法找到我缺少的内容:(