Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 什么处理了转换异常?_Java_Jackson_Jax Rs_Restlet - Fatal编程技术网

Java 什么处理了转换异常?

Java 什么处理了转换异常?,java,jackson,jax-rs,restlet,Java,Jackson,Jax Rs,Restlet,如果您有一个具有如下POST方法的资源 @POST @Consumes({"application/json"}) @Produces({"application/json"}) public Response createProfileExtensionSchema(ExtensionMetaDataRest extensionSchema, @Context UriInfo info) 对象ExtensionMetaDataRest用jackson注释 如果您有一个JAX-RS应用程序

如果您有一个具有如下POST方法的资源

@POST
@Consumes({"application/json"})
@Produces({"application/json"})
public Response createProfileExtensionSchema(ExtensionMetaDataRest extensionSchema, @Context UriInfo info) 
对象ExtensionMetaDataRest用jackson注释

如果您有一个JAX-RS应用程序

public class MyJaxrsApplication extends JaxRsApplication implements InitializingBean, BeanFactoryAware {

  @Autowired
  @Qualifier("restletComponent")
  public Component component;

  @Autowired
  public MyJaxrsApplication(final Context context) {
    super(context);
  }

  public void afterPropertiesSet() throws Exception {
    setContext(component.getContext().createChildContext());
    add(new MyApplication());
    getJaxRsRestlet().addClass(ServiceExceptionMapper.class);
    getJaxRsRestlet().addClass(BaseExceptionMapper.class);
    component.getDefaultHost().attach(this);
  }

  public void setBeanFactory(final BeanFactory beanFactory) throws BeansException {
    setObjectFactory(new ObjectFactory() {
      public <T> T getInstance(Class<T> jaxRsClass) throws InstantiateException {
        // Bean instantiation is delegated to spring
        return beanFactory.getBean(jaxRsClass);
      }
    });
  }
}
所以我依赖ExceptionMapper来处理异常响应。这在大多数情况下都可以正常工作,除非出现JSON错误。如果json格式不好,我希望通过异常映射程序,但是我得到了一个400错误请求,内容如下:

org.restlet.ext.jaxrs.internal.exceptions.ConvertRepresentationException: Could not convert the message body to a com.genesys.ucs.cs.model.ExtensionMetaDataRest
    at org.restlet.ext.jaxrs.internal.exceptions.ConvertRepresentationException.object(ConvertRepresentationException.java:49)
    at org.restlet.ext.jaxrs.internal.wrappers.params.EntityGetter.getValue(EntityGetter.java:107)
    at org.restlet.ext.jaxrs.internal.wrappers.params.ParameterList.get(ParameterList.java:1123)
    at org.restlet.ext.jaxrs.internal.wrappers.AbstractMethodWrapper.internalInvoke(AbstractMethodWrapper.java:160)
    at org.restlet.ext.jaxrs.internal.wrappers.ResourceMethod.invoke(ResourceMethod.java:283)
    at org.restlet.ext.jaxrs.JaxRsRestlet.invokeMethod(JaxRsRestlet.java:997)
    at org.restlet.ext.jaxrs.JaxRsRestlet.handle(JaxRsRestlet.java:746)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.engine.application.StatusFilter.doHandle(StatusFilter.java:140)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.engine.CompositeHelper.handle(CompositeHelper.java:202)
    at org.restlet.engine.application.ApplicationHelper.handle(ApplicationHelper.java:75)
    at org.restlet.Application.handle(Application.java:385)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.routing.Router.doHandle(Router.java:422)
    at org.restlet.routing.Router.handle(Router.java:639)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.routing.Router.doHandle(Router.java:422)
    at org.restlet.routing.Router.handle(Router.java:639)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.engine.application.StatusFilter.doHandle(StatusFilter.java:140)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.engine.CompositeHelper.handle(CompositeHelper.java:202)
    at org.restlet.Component.handle(Component.java:408)
    at org.restlet.Server.handle(Server.java:507)
    at org.restlet.engine.connector.ServerHelper.handle(ServerHelper.java:63)
    at org.restlet.engine.adapter.HttpServerHelper.handle(HttpServerHelper.java:143)
    at org.restlet.ext.jetty.JettyServerHelper$WrappedServer.handle(JettyServerHelper.java:273)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
    at java.lang.Thread.run(Thread.java:745)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Unexpected character ('}' (code 125)): was expecting double-quote to start field name
 at [Source: HttpInputOverHTTP@2725f2e5; line: 2, column: 39] (through reference chain: com.genesys.ucs.cs.model.ExtensionMetaDataRest["attributes"]->java.util.ArrayList[0])
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:210)
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:189)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:249)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:206)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:25)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:538)
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:99)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:238)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:118)
    at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1269)
    at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:864)
    at org.restlet.ext.jackson.JacksonRepresentation.getObject(JacksonRepresentation.java:299)
    at org.restlet.ext.jackson.JacksonConverter.toObject(JacksonConverter.java:208)
    at org.restlet.service.ConverterService.toObject(ConverterService.java:229)
    at org.restlet.ext.jaxrs.internal.provider.ConverterProvider.readFrom(ConverterProvider.java:144)
    at org.restlet.ext.jaxrs.internal.wrappers.provider.SingletonProvider.readFrom(SingletonProvider.java:409)
    at org.restlet.ext.jaxrs.internal.wrappers.params.EntityGetter.getValue(EntityGetter.java:101)
    ... 42 more
Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('}' (code 125)): was expecting double-quote to start field name
 at [Source: HttpInputOverHTTP@2725f2e5; line: 2, column: 39]
    at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1419)
    at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:508)
    at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:437)
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleOddName(UTF8StreamJsonParser.java:1799)
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._parseName(UTF8StreamJsonParser.java:1496)
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:693)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:231)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:118)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:232)
    ... 56 more
我不明白为什么这不是通过异常映射器处理的

我试图禁用状态服务,但没有任何更改。 我尝试添加我自己的,但没有使用


如果资源内部发生错误,将调用异常映射程序,但不会在jackson转换期间调用。我希望能够自定义在json转换错误的情况下发送回用户的消息

在查看JAXRS扩展的代码后,似乎
ConvertRepresentationException
s直接包装到JAXRS
WebApplicationException
中。应在此级别使用
JaxRsProviders.convert
方法,但实际情况并非如此。因此,在这种情况下不能利用JAXRS ExceptionHandler

有关更多详细信息,请参阅
JaxRsRestlet#invokeMethod
ExceptionHandler#convertRepresentationExc
方法的内容。似乎
JaxRsRestlet#handleInvocationTargetExc
方法的内容就是您所期望的行为

我为此创建了一个问题:

希望它能帮助你,
Thierry

在查看了JAXRS扩展的代码之后,似乎将
ConvertRepresentationException
s直接包装到JAXRS
WebApplicationException
中。应在此级别使用
JaxRsProviders.convert
方法,但实际情况并非如此。因此,在这种情况下不能利用JAXRS ExceptionHandler

有关更多详细信息,请参阅
JaxRsRestlet#invokeMethod
ExceptionHandler#convertRepresentationExc
方法的内容。似乎
JaxRsRestlet#handleInvocationTargetExc
方法的内容就是您所期望的行为

我为此创建了一个问题:

希望它能帮助你,
蒂埃里

谢谢蒂埃里。有没有办法使用现有的机制来重载此行为?谢谢Thierry。是否有任何方法可以使用现有机制来重载此行为?
org.restlet.ext.jaxrs.internal.exceptions.ConvertRepresentationException: Could not convert the message body to a com.genesys.ucs.cs.model.ExtensionMetaDataRest
    at org.restlet.ext.jaxrs.internal.exceptions.ConvertRepresentationException.object(ConvertRepresentationException.java:49)
    at org.restlet.ext.jaxrs.internal.wrappers.params.EntityGetter.getValue(EntityGetter.java:107)
    at org.restlet.ext.jaxrs.internal.wrappers.params.ParameterList.get(ParameterList.java:1123)
    at org.restlet.ext.jaxrs.internal.wrappers.AbstractMethodWrapper.internalInvoke(AbstractMethodWrapper.java:160)
    at org.restlet.ext.jaxrs.internal.wrappers.ResourceMethod.invoke(ResourceMethod.java:283)
    at org.restlet.ext.jaxrs.JaxRsRestlet.invokeMethod(JaxRsRestlet.java:997)
    at org.restlet.ext.jaxrs.JaxRsRestlet.handle(JaxRsRestlet.java:746)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.engine.application.StatusFilter.doHandle(StatusFilter.java:140)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.engine.CompositeHelper.handle(CompositeHelper.java:202)
    at org.restlet.engine.application.ApplicationHelper.handle(ApplicationHelper.java:75)
    at org.restlet.Application.handle(Application.java:385)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.routing.Router.doHandle(Router.java:422)
    at org.restlet.routing.Router.handle(Router.java:639)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.routing.Router.doHandle(Router.java:422)
    at org.restlet.routing.Router.handle(Router.java:639)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.engine.application.StatusFilter.doHandle(StatusFilter.java:140)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.engine.CompositeHelper.handle(CompositeHelper.java:202)
    at org.restlet.Component.handle(Component.java:408)
    at org.restlet.Server.handle(Server.java:507)
    at org.restlet.engine.connector.ServerHelper.handle(ServerHelper.java:63)
    at org.restlet.engine.adapter.HttpServerHelper.handle(HttpServerHelper.java:143)
    at org.restlet.ext.jetty.JettyServerHelper$WrappedServer.handle(JettyServerHelper.java:273)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
    at java.lang.Thread.run(Thread.java:745)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Unexpected character ('}' (code 125)): was expecting double-quote to start field name
 at [Source: HttpInputOverHTTP@2725f2e5; line: 2, column: 39] (through reference chain: com.genesys.ucs.cs.model.ExtensionMetaDataRest["attributes"]->java.util.ArrayList[0])
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:210)
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:189)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:249)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:206)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:25)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:538)
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:99)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:238)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:118)
    at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1269)
    at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:864)
    at org.restlet.ext.jackson.JacksonRepresentation.getObject(JacksonRepresentation.java:299)
    at org.restlet.ext.jackson.JacksonConverter.toObject(JacksonConverter.java:208)
    at org.restlet.service.ConverterService.toObject(ConverterService.java:229)
    at org.restlet.ext.jaxrs.internal.provider.ConverterProvider.readFrom(ConverterProvider.java:144)
    at org.restlet.ext.jaxrs.internal.wrappers.provider.SingletonProvider.readFrom(SingletonProvider.java:409)
    at org.restlet.ext.jaxrs.internal.wrappers.params.EntityGetter.getValue(EntityGetter.java:101)
    ... 42 more
Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('}' (code 125)): was expecting double-quote to start field name
 at [Source: HttpInputOverHTTP@2725f2e5; line: 2, column: 39]
    at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1419)
    at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:508)
    at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:437)
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleOddName(UTF8StreamJsonParser.java:1799)
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._parseName(UTF8StreamJsonParser.java:1496)
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:693)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:231)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:118)
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:232)
    ... 56 more