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

如题所述

@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); }
温馨提示:答案为网友推荐,仅供参考
相似回答