关于SpringMVC中@ResponseBody怎么知道我需要什么类型
2016-09-18 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
关注
展开全部
@ResponseBody注解在method上具体返回什么类型的数据流(json、xml等)主要有两个方面决定的:1.是否有对应的第三方jar包出现在classpath,比如jacksonjar、jaxb2
jar,如果只存在springmvc就会注册对应的HttpMessageConvert(将returnobj写为response的流是靠httpMessageConvert的实现类来完成的)2.有@RequestMapping注解的consumes具体的mediaTypes和http请求的accept能结束的mimetype来联合决定。有这两点决定@ResponseBody注解的返回值的返回流的类型具体的实现参见RequestResponseBodyMthodProcessor,java中,具体的写流实现如下在AbstractMessageConverterMethodProcessor.writeWithMessageConverters()来实现的。具体代码:
/** *Writesthegivenreturntypetothegivenoutputmessage. * *@paramreturnValuethevaluetowritetotheoutputmessage *@paramreturnTypethetypeofthevalue *@paraminputMessagetheinputmessages.Usedtoinspectthe{@codeAccept}header. *@paramoutputMessagetheoutputmessagetowriteto *@throwsIOExceptionthrownincaseofI/Oerrors *@throwsHttpMediaTypeNotAcceptableExceptionthrownwhentheconditionsindicatedby{@codeAccept}headeron *therequestcannotbemetbythemessageconverters */ @SuppressWarnings("unchecked") protected<T>voidwriteWithMessageConverters(TreturnValue, MethodParameterreturnType, ServletServerHttpRequestinputMessage, ServletServerHttpResponseoutputMessage) throwsIOException,HttpMediaTypeNotAcceptableException{ Class<?>returnValueClass=returnValue.getClass(); HttpServletRequestservletRequest=inputMessage.getServletRequest(); List<MediaType>requestedMediaTypes=getAcceptableMediaTypes(servletRequest); List<MediaType>producibleMediaTypes=getProducibleMediaTypes(servletRequest,returnValueClass); Set<MediaType>compatibleMediaTypes=newLinkedHashSet<MediaType>(); for(MediaTyper:requestedMediaTypes){ for(MediaTypep:producibleMediaTypes){ if(r.isCompatibleWith(p)){ compatibleMediaTypes.add(getMostSpecificMediaType(r,p)); } } } if(compatibleMediaTypes.isEmpty()){ thrownewHttpMediaTypeNotAcceptableException(producibleMediaTypes); } List<MediaType>mediaTypes=newArrayList<MediaType>(compatibleMediaTypes); MediaType.sortBySpecificityAndQuality(mediaTypes); MediaTypeselectedMediaType=null; for(MediaTypemediaType:mediaTypes){ if(mediaType.isConcrete()){ selectedMediaType=mediaType; break; } elseif(mediaType.equals(MediaType.ALL)||mediaType.equals(MEDIA_TYPE_APPLICATION)){ selectedMediaType=MediaType.APPLICATION_OCTET_STREAM; break; } } if(selectedMediaType!=null){ selectedMediaType=selectedMediaType.removeQualityValue(); for(HttpMessageConverter<?>messageConverter:messageConverters){ if(messageConverter.canWrite(returnValueClass,selectedMediaType)){ ((HttpMessageConverter<T>)messageConverter).write(returnValue,selectedMediaType,outputMessage); if(logger.isDebugEnabled()){ logger.debug("Written["+returnValue+"]as\""+selectedMediaType+"\"using["+ messageConverter+"]"); } return; } } } thrownewHttpMediaTypeNotAcceptableException(allSupportedMediaTypes); }
jar,如果只存在springmvc就会注册对应的HttpMessageConvert(将returnobj写为response的流是靠httpMessageConvert的实现类来完成的)2.有@RequestMapping注解的consumes具体的mediaTypes和http请求的accept能结束的mimetype来联合决定。有这两点决定@ResponseBody注解的返回值的返回流的类型具体的实现参见RequestResponseBodyMthodProcessor,java中,具体的写流实现如下在AbstractMessageConverterMethodProcessor.writeWithMessageConverters()来实现的。具体代码:
/** *Writesthegivenreturntypetothegivenoutputmessage. * *@paramreturnValuethevaluetowritetotheoutputmessage *@paramreturnTypethetypeofthevalue *@paraminputMessagetheinputmessages.Usedtoinspectthe{@codeAccept}header. *@paramoutputMessagetheoutputmessagetowriteto *@throwsIOExceptionthrownincaseofI/Oerrors *@throwsHttpMediaTypeNotAcceptableExceptionthrownwhentheconditionsindicatedby{@codeAccept}headeron *therequestcannotbemetbythemessageconverters */ @SuppressWarnings("unchecked") protected<T>voidwriteWithMessageConverters(TreturnValue, MethodParameterreturnType, ServletServerHttpRequestinputMessage, ServletServerHttpResponseoutputMessage) throwsIOException,HttpMediaTypeNotAcceptableException{ Class<?>returnValueClass=returnValue.getClass(); HttpServletRequestservletRequest=inputMessage.getServletRequest(); List<MediaType>requestedMediaTypes=getAcceptableMediaTypes(servletRequest); List<MediaType>producibleMediaTypes=getProducibleMediaTypes(servletRequest,returnValueClass); Set<MediaType>compatibleMediaTypes=newLinkedHashSet<MediaType>(); for(MediaTyper:requestedMediaTypes){ for(MediaTypep:producibleMediaTypes){ if(r.isCompatibleWith(p)){ compatibleMediaTypes.add(getMostSpecificMediaType(r,p)); } } } if(compatibleMediaTypes.isEmpty()){ thrownewHttpMediaTypeNotAcceptableException(producibleMediaTypes); } List<MediaType>mediaTypes=newArrayList<MediaType>(compatibleMediaTypes); MediaType.sortBySpecificityAndQuality(mediaTypes); MediaTypeselectedMediaType=null; for(MediaTypemediaType:mediaTypes){ if(mediaType.isConcrete()){ selectedMediaType=mediaType; break; } elseif(mediaType.equals(MediaType.ALL)||mediaType.equals(MEDIA_TYPE_APPLICATION)){ selectedMediaType=MediaType.APPLICATION_OCTET_STREAM; break; } } if(selectedMediaType!=null){ selectedMediaType=selectedMediaType.removeQualityValue(); for(HttpMessageConverter<?>messageConverter:messageConverters){ if(messageConverter.canWrite(returnValueClass,selectedMediaType)){ ((HttpMessageConverter<T>)messageConverter).write(returnValue,selectedMediaType,outputMessage); if(logger.isDebugEnabled()){ logger.debug("Written["+returnValue+"]as\""+selectedMediaType+"\"using["+ messageConverter+"]"); } return; } } } thrownewHttpMediaTypeNotAcceptableException(allSupportedMediaTypes); }
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询