Не зная вашего полного приложения, трудно сказать, каков наилучший способ решения проблемы, но распространенным методом является использование заголовка, который начинается с поля фиксированной длины, которое обозначает длину остальной части вашего сообщения. .
Предположим, что ваш заголовок состоит только из 4-байтового целого числа, которое обозначает длину остальной части вашего сообщения. Затем просто сделайте следующее.
// This assumes buffer is at least x bytes long,
// and that the socket is blocking.
void ReadXBytes(int socket, unsigned int x, void* buffer)
{
int bytesRead = 0;
int result;
while (bytesRead < x)
{
result = read(socket, buffer + bytesRead, x - bytesRead);
if (result < 1 )
{
// Throw your error.
}
bytesRead += result;
}
}
Затем в коде
unsigned int length = 0;
char* buffer = 0;
// we assume that sizeof(length) will return 4 here.
ReadXBytes(socketFileDescriptor, sizeof(length), (void*)(&length));
buffer = new char[length];
ReadXBytes(socketFileDescriptor, length, (void*)buffer);
// Then process the data as needed.
delete [] buffer;
делается несколько предположений:
Поскольку принято хотеть явно знать размер целого числа, которое вы посылаете по сети, определите их в заголовочном файле и используйте их явно, например:
// These typedefs will vary across different platforms
// such as linux, win32, OS/X etc, but the idea
// is that a Int8 is always 8 bits, and a UInt32 is always
// 32 bits regardless of the platform you are on.
// These vary from compiler to compiler, so you have to
// look them up in the compiler documentation.
typedef char Int8;
typedef short int Int16;
typedef int Int32;
typedef unsigned char UInt8;
typedef unsigned short int UInt16;
typedef unsigned int UInt32;
Это будет измените вышеприведенное на:
UInt32 length = 0;
char* buffer = 0;
ReadXBytes(socketFileDescriptor, sizeof(length), (void*)(&length));
buffer = new char[length];
ReadXBytes(socketFileDescriptor, length, (void*)buffer);
// process
delete [] buffer;
Надеюсь, это поможет.
Попробуйте снять ограничение заголовка для Accept
, поставить точку останова и посмотреть, что является фактическим значением. Или сделайте это с FireBug.
Также взгляните на этот вопрос jquery
Ну, ответы на этой странице могут быть правильными, но они не очень хорошо расширились. Это то, что я сделал
Я добавил это в свой pom.xml
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.8</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.8</version>
</dependency>
Затем я добавил заголовки в свой RequestMapping, как показано ниже
@RequestMapping(value="/admin/getGallery", method = RequestMethod.GET, headers={"Content-Type=application/json"})
Затем в моем jquery Я добавил ajax - contentType: "application / json", поэтому он выглядит как
jQuery.ajax({
type:'GET',
url:"getGallery.html",
data: "designId="+designId,
processData:false,
contentType: "application/json",
//dataType: "json",
success:function(data){
console.log(data);
},
error : function(e) {
console.log("ERROR: ", e);
},
});
Затем в свой сервлет я добавил
<bean id="jsonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
<!-- Bind the return value of the Rest service to the ResponseBody. -->
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<util:list id="beanList">
<ref bean="jsonHttpMessageConverter" />
</util:list>
</property>
</bean>
Если у вас есть проблема с тегом util в вашем сервлете просто добавьте в тот же файл сервлета
xmlns:util="http://www.springframework.org/schema/util"
и
xsi:schemaLocation="http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd
Используя jQuery, вы можете установить для contentType желаемый (application / json; charset = UTF-8 'здесь) и установить тот же заголовок на стороне сервера.
ПОМНИТЕ, ЧТОБЫ ОЧИСТИТЬ КЭШ В ТЕЧЕНИЕ.
Проблема не связана с jquery. даже ошибка говорит, что это проблема на стороне сервера. пожалуйста, убедитесь, что следующие 2 jar присутствуют в пути к классу: -
jackson-core-asl-1.9.X.jar jackson-mapper-asl-1.9.X.jar
Добавьте org.springframework.http.converter.json.MappingJacksonHttpMessageConverter
и org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
в DispatcherServlet-servlet.xml. и обратитесь к первому во втором, используя
<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jacksonMessageConverter"/>
</list>
</property>
</bean>
У меня тоже была эта проблема, вы должны добавить <mvc:annotation-driven />
в вашей конфигурации xml
и
<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.databind-version}</version>
</dependency>
в вашем pom.xml
Чтобы вернуть JSON-ответ от @ResponseBody
-аннотированного метода, вам нужны две вещи:
<mvc:annotation-driven />
(у вас уже есть) Вам не нужны ContentNegotiatingViewResolver
и headers
в @RequestMapping
.