关于Spring MVC中@ResponseBody怎么知道我需要什么类型

 我来答
匿名用户
2015-09-05
展开全部
@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); }
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式