Аннотации Джексона игнорируются весной
Я пытаюсь сделать свойство в доменном классе скрытым, но оно продолжает появляться в выводимом JSON. Я использую Jackson 2.0 и Spring 3.1.1
Вывод /users/1:
{"id":1,"password":null,"email":"someone@somewhere.com","firstName":"John","lastName":"Smith"}
Класс моего домена:
@Entity
public class User {
private String mPassword;
...
@JsonIgnore
public String getPassword() {
return mPassword;
}
public void setPassword(String password) {
mPassword = password;
}
...
}
Мой конфиг springmvc:
...
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="favorPathExtension" value="true" />
<property name="mediaTypes">
<map>
<entry key="json" value="application/json"/>
</map>
</property>
<property name="defaultContentType" value="application/json"/>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
</list>
</property>
</bean>
...
И мой контроллер:
@Controller
@RequestMapping("/users")
public class UserController {
private UserService mUserService;
public UserController(){}
@Inject
public void setUserController(UserService userService){
mUserService=userService;
}
@RequestMapping(value="/{id}", method=RequestMethod.GET)
public void getUser(@PathVariable("id") long id, Model model){
model.addAttribute(mUserService.getUser(id));
}
}
5 ответов
Проблема в том, что Spring не работает с Jackson 2.0. Это было решено следующим образом:
<bean id="jacksonMessageConverter"
class="own.implementation.of.MappingJacksonHttpMessageConverter"/>
<bean class="org.springframework.web.servlet.mvc
.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jacksonMessageConverter"/>
</list>
</property>
<property name="requireSession" value="false"/>
</bean>
И own.implementation.of.MappingJacksonHttpMessageConverter основан на этом:
Но используйте ObjectMapper и другие классы Джексона из Джексона 2.0 вместо Джексона 1.*
Поддержка Jackson 2 была добавлена в Spring 3.1.2 (перенесена из Spring 3.2 - SPR-9507). Просто обновите ваш проект с Spring 3.1.1 до Spring 3.1.2, и Jackson 2 работает с уже имеющейся конфигурацией.
В дополнение к обновлению до Spring 3.1.2
Вы также должны изменить конвертер сообщений на org.springframework.web.servlet.view.json.MappingJackson**2**HttpMessageConverter
Если вы используете версию Spring 4, вам придется сделать следующее, обновить зависимость
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.3.3</version>
</dependency>
Замените более старый импорт аннотаций Codehaus следующим, если вы этого не сделаете, ваши старые аннотации, такие как JsonIgnoreProperties, не будут работать с новой версией Jackson.
import com.fasterxml.jackson.annotation.*;
Удалите mediaTypes снизу, это устарело.
ContentNegotiatingViewResolver
, Не нужно, будет взято из фляги активации рамки, Джексон вид должен использовать
MappingJackson2JsonView
<beans:property name="viewResolvers">
<beans:list>
<beans:bean
class="org.springframework.web.servlet.view.BeanNameViewResolver" />
<beans:bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<beans:bean
class="org.springframework.web.servlet.view.tiles3.TilesViewResolver">
<beans:property name="viewClass"
value="org.springframework.web.servlet.view.tiles3.TilesView"></beans:property>
<beans:property name="order" value="0"></beans:property>
</beans:bean>
</beans:list>
</beans:property>
<beans:property name="defaultViews">
<beans:list>
<beans:bean
class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />
</beans:list>
</beans:property>
Моя конфигурация выглядит так
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" p:order="1">
<property name="mediaTypes">
<map>
<entry key="html" value="text/html"/>
<entry key="json" value="application/json"/>
</map>
</property>
<property name="viewResolvers">
<!-- this is not important for your jackson problem -->
<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:viewClass="org.springframework.web.servlet.view.tiles2.TilesView" p:order="2" depends-on="tilesConfigurer"/>
</property>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
</list>
</property>
</bean>
Мой контроллер выглядит так
@Controller
public class SearchController {
@RequestMapping(value="/search", method = {RequestMethod.GET, RequestMethod.POST})
public SearchResponse search(@RequestParam(value = QUERY, required = true) String query) {
return generateSearchResponse(query);
}
}
Мой SearchResponse является более сложной структурой, но он содержит объекты этого типа.
@JsonIgnoreProperties({ "popis" })
public class Kurz implements Serializable {
private String nazev;
private String popis;
}