Spring mvc не возвращает содержимое json - ошибка 406

Не зная вашего полного приложения, трудно сказать, каков наилучший способ решения проблемы, но распространенным методом является использование заголовка, который начинается с поля фиксированной длины, которое обозначает длину остальной части вашего сообщения. .

Предположим, что ваш заголовок состоит только из 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;

Надеюсь, это поможет.

26
задан Marplesoft 15 July 2013 в 07:58
поделиться

7 ответов

Попробуйте снять ограничение заголовка для Accept, поставить точку останова и посмотреть, что является фактическим значением. Или сделайте это с FireBug.

Также взгляните на этот вопрос jquery

8
ответ дан 20 November 2019 в 07:29
поделиться

Ну, ответы на этой странице могут быть правильными, но они не очень хорошо расширились. Это то, что я сделал

Я добавил это в свой 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
1
ответ дан 20 November 2019 в 07:29
поделиться

Используя jQuery, вы можете установить для contentType желаемый (application / json; charset = UTF-8 'здесь) и установить тот же заголовок на стороне сервера.

ПОМНИТЕ, ЧТОБЫ ОЧИСТИТЬ КЭШ В ТЕЧЕНИЕ.

0
ответ дан 20 November 2019 в 07:29
поделиться

Проблема не связана с jquery. даже ошибка говорит, что это проблема на стороне сервера. пожалуйста, убедитесь, что следующие 2 jar присутствуют в пути к классу: -

jackson-core-asl-1.9.X.jar jackson-mapper-asl-1.9.X.jar

1
ответ дан 20 November 2019 в 07:29
поделиться

Добавьте 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>
8
ответ дан 20 November 2019 в 07:29
поделиться

У меня тоже была эта проблема, вы должны добавить <mvc:annotation-driven /> в вашей конфигурации xml

и

<!-- Jackson -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.databind-version}</version>
        </dependency>

в вашем pom.xml

2
ответ дан 20 November 2019 в 07:29
поделиться

Чтобы вернуть JSON-ответ от @ResponseBody -аннотированного метода, вам нужны две вещи:

Вам не нужны ContentNegotiatingViewResolver и headers в @RequestMapping.

23
ответ дан 20 November 2019 в 07:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: