Tôi đang phải vật lộn với điều này:Spring MVC cấu hình + Jackson + Ổi Multimap
Chúng tôi có một lớp Bảng với một Multimap Ổi (mã đơn giản, về cơ bản 1 thành viên, 2 nhà thầu, phương thức getter và setter cho Multimap):
public class Table {
private LinkedHashMultimap<String,Field> fields;
public Table(){
this.fields = LinkedHashMultimap.create();
};
public Table (LinkedHashMultimap<String, Field> fields){
this.fields= fields;
}
public LinkedHashMultimap<String, Field> getFields() {
return fields;
}
public void setFields(LinkedHashMultimap<String, Field> fields) {
this.fields = fields;
}
}
Và tôi muốn nối tiếp điều này bằng cách sử dụng Spring MVC 3.2.11 sử dụng jackson 2.4.3.
POM phụ thuộc có liên quan bao gồm:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.4.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-guava</artifactId>
<version>2.4.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.11.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.11.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
My spring.xml VỚI DOANH NGHIỆP trông như thế này (sau đây này example)
<bean id="abstractJacksonObjectMapper"
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"
p:targetMethod="registerModule">
<property name="targetObject">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"
p:indentOutput="true">
<!--<property name="featuresToDisable">-->
<!--<util:constant static-field="com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES" />-->
<!--</property>-->
</bean>
</property>
<property name="arguments">
<list>
<bean class="com.fasterxml.jackson.datatype.guava.GuavaModule" />
</list>
</property>
</bean>
<bean id="abstractMappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"
abstract="true"/>
<bean id="abstractMappingJacksonJsonView"
class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"
abstract="true"
p:extractValueFromSingleKeyModel="true"/>
<bean id="jacksonObjectMapper" parent="abstractJacksonObjectMapper" />
<bean id="mappingJacksonHttpMessageConverter"
parent="abstractMappingJacksonHttpMessageConverter"
p:objectMapper-ref="jacksonObjectMapper"
p:supportedMediaTypes="application/json" />
<bean id="mappingJacksonJsonView"
parent="abstractMappingJacksonJsonView"
p:objectMapper-ref="jacksonObjectMapper"
p:contentType="application/json" />
Tôi cũng thử phương pháp này khác sử dụng một mở rộng Jackson2ObjectMapperFactoryBean:
<!-- Json rendering configuration-->
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order" value="1" />
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</map>
</property>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
<property name="objectMapper">
<bean class="my.package.Jackson2ObjectMapperFactoryBean"/>
</property>
</bean>
</list>
</property>
<property name="ignoreAcceptHeader" value="true" />
</bean>
Và sau đó FactoryBean trông như thế này:
package my.package;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.guava.GuavaModule;
public class Jackson2ObjectMapperFactoryBean extends org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean{
public ObjectMapper getObject(){
ObjectMapper objectMapper =super.getObject();
objectMapper.registerModule(new GuavaModule());
return objectMapper;
}
}
Tôi có một class Test rằng hoạt động tốt và không được sử dụng Spring ở tất cả (chỉ là thử nghiệm Table.class + Jackson + ổi) Đơn giản:
Table study = getTable();
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new GuavaModule());
String tableString = mapper.writeValueAsString(table);
Nó nối tiếp đúng:
{
"fields":{
"Field1":[
{
"index":0,
"header":"Field1",
"fieldType":"fieldtype",
"description":null,
"cleanHeader":null
}
],
"Field2":[
{
"index":1,
"header":"Field2",
"fieldType":"fieldtype",
"description":null,
"cleanHeader":null
}
]
}
}
Sử dụng lò xo (bất kỳ của 2 lối vào) tôi nhận được:
{
"fields":{
"empty": false
}
}
điều khiển của tôi có một chú thích @ResponseBody và nó trả về một Table.
CHỈNH SỬA: Tôi đang gỡ lỗi sâu vào các lớp học mùa xuân (firs time, ;-)) và org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor đang xử lý yêu cầu. Điều này liên quan đến vấn đề của tôi ... Xml mùa xuân của tôi, bằng cách nào đó mâu thuẫn với chú thích @ResponseBody?
Bất kỳ ý tưởng nào tôi đang làm sai?
LƯU Ý: Tôi cần Multimap, không thể là bộ sưu tập Java tiêu chuẩn.
Cảm ơn Katerina! Tôi đã thêm mã của bạn và đã thử với cả hai cách tiếp cận trên .... Tôi nhận được cùng một "trường": {"rỗng": false} kết quả. – Pablo