- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在 previous similar question 中,我问过,如何使用 JacksonJson 和 Spring 序列化两组不同的字段。
我的用例是典型的 Controller 映射 @ResponseBody
注释直接返回特定对象或对象集合,然后在客户端添加 application/json
时使用 JacksonJson 呈现在 Accept
标题。
我有两个答案,第一个建议使用不同的 getter 列表返回不同的接口(interface),第二个建议使用 Json Views。
在阅读了 JacksonJsonViews
上的文档后,我对第一种方法的理解没有问题,但是第二种方法。 ,不知道怎么用Spring实现。
为了继续举例,我将在 Views 类中声明三个 stub 类:
// View definitions:
public class Views {
public static class Public { }
public static class ExtendedPublic extends PublicView { }
public static class Internal extends ExtendedPublicView { }
}
然后我要声明提到的类:
public class PublicView { }
public class ExtendedPublicView { }
他们到底为什么要声明空静态类和外部空类,我不知道。我知道他们需要一个“标签”,但是 Views 的静态成员就足够了。并不是ExtendedPublic
延长 Public
,因为这是合乎逻辑的,但实际上它们完全不相关。
最后,bean 将通过注解指定 View 或 View 列表:
//changed other classes to String for simplicity and fixed typo
//in classname, the values are hardcoded, just for testing
public class Bean {
// Name is public
@JsonView(Views.Public.class)
String name = "just testing";
// Address semi-public
@JsonView(Views.ExtendedPublic.class)
String address = "address";
// SSN only for internal usage
@JsonView(Views.Internal.class)
String ssn = "32342342";
}
最后在 Spring Controller 中,我要考虑如何更改我的测试 bean 的原始映射:
@RequestMapping(value = "/bean")
@ResponseBody
public final Bean getBean() {
return new Bean();
}
它说调用:
//or, starting with 1.5, more convenient (ObjectWriter is reusable too)
objectMapper.viewWriter(ViewsPublic.class).writeValue(out, beanInstance);
所以我有一个 ObjectMapper
突然出现的实例和 out
这不是典型的 servlet PrintWriter out = response.getWriter();
, 但是是 JsonGenerator
的一个实例并且无法使用 new 运算符获得。所以不知道怎么修改方法,这里是一个不完整的尝试:
@RequestMapping(value = "/bean")
@ResponseBody
public final Bean getBean() throws JsonGenerationException, JsonMappingException, IOException {
ObjectMapper objectMapper = new ObjectMapper();
JsonGenerator out; //how to create?
objectMapper.viewWriter(Views.Public.class).writeValue(out, new Bean());
return ??; //what should I return?
}
所以我想知道是否有人成功使用 JsonView
与 Spring 以及他/她是如何做到的。整个概念看起来很有趣,但文档似乎缺乏,示例代码也不见了。
如果不可能,我将只使用相互扩展的接口(interface)。抱歉问了这么长的问题。
最佳答案
根据@igbopie 和@chrislovecnm 的回答,我整理了一个注释驱动的解决方案:
@Controller
public class BookService
{
@RequestMapping("/books")
@ResponseView(SummaryView.class)
public @ResponseBody List<Book> getBookSummaries() {}
@RequestMapping("/books/{bookId}")
public @ResponseBody Book getBook(@PathVariable("bookId") Long BookId) {}
}
SummaryView
在 Book
模型上的注释如下:
@Data
class Book extends BaseEntity
{
@JsonView(SummaryView.class)
private String title;
@JsonView(SummaryView.class)
private String author;
private String review;
public static interface SummaryView extends BaseView {}
}
@Data
public class BaseEntity
{
@JsonView(BaseView.class)
private Long id;
}
public interface BaseView {}
然后将自定义 HandlerMethodReturnValueHandler
连接到 Spring MVC 的上下文中以检测 @ResponseView
注释,并相应地应用 Jackson View 。
我已提供完整代码 over on my blog .
关于json - Spring和Jackson Json,用 View 序列化不同的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7793689/
我找不到关于 jackson 的ObjectMapper与其他映射器(例如dozer/mapStruct/modelMapping/etc)之间的区别的任何解释。所有文章都比较了dozer/mapSt
我正在使用Jackson来反序列化Kotlin数据类。我正在使用jackson-kotlin-module,但 jackson 却给我以下错误: Can not construct instance
我正在尝试将包从“com.fasterxml.jackson”重新定位到我自己的包(即“mypackage.com.fasterxml.jackson”),然后在我拥有的另一个 JAR 中使用它。 我
对于JSON对象,Subject: { "permissions":["foo", "bar"], ... } ...我想反序列化为: class Subject { priv
我正在使用 @JsonTypeInfo 和 @JsonSubTypes 来映射基于给定属性的解析子类。这是我想要解析的示例 JSON 的一个人为示例。 { "animals": [ { "
我们正在使用 dropwizard 版本 0.6.3。当我们尝试升级 0.7.0 版本时,我们在服务启动时收到此错误。 线程“main”中的异常 java.lang.VerifyError: clas
我正在尝试实现自定义解串器。因为我只想向默认反序列化器添加功能,所以我尝试在我的自定义反序列化器中存储默认反序列化器:我想使用默认反序列化 json,然后添加其他信息。 我正在尝试使用 BeanDes
我有一个这样的类(class): public class Person { private String name; public String getName(){ return
我有以下 Kotlin 数据类: data class TestObject( val boolField: Boolean, val stringField: Str
使用 Jackson 库,在 Eclipse 4.9.0 版本中出现以下错误 缺少工件 com.fasterxml.jackson.core:jackson-databind:bundle:2.9.6
我试图在我的应用程序中从azure实现keyvault,在为DefaultAzureCredentialBuilder()实现azure-identity:1.5.4 lib后,它会抛出链接错误,如下
我试图在我的应用程序中从azure实现keyvault,在为DefaultAzureCredentialBuilder()实现azure-identity:1.5.4 lib后,它会抛出链接错误,如下
我知道我们可以使用 Jackson MixIn 来重命名属性或忽略属性(参见示例 here )。但是可以添加属性吗? 添加的属性可以是: 一个常数(如版本号) 计算值(例如,如果源类具有 getWid
我有一个在 Wildfly 10 上运行的应用程序,它需要更新版本的 jackson。简单地更新 maven 依赖是行不通的。 Wildflys 自己的版本似乎干扰了... 有人有提示吗? 最佳答案
我在 Tomcat 休息应用程序中运行 Jersey 2.5.1 & Jackson。对于我最初将 POJO 简单地转换为 JSON 的用例,基本设置效果很好。集合很好地转换为 json 数组,如下所
有没有办法告诉 jackson 在序列化过程中忽略那些用非 jackson 注释注释的字段? 例如: @SomeAnnotation private String foo; 我知道有 jackson
我遇到了 jackson 序列化问题, map 中存在空值。显然,这是 Wildfly 9 使用的 Jackson 版本中的一个已知错误 ( https://issues.jboss.org/brow
给定一个像这样的 JSON 映射类: public class Person { @JsonProperty String getName() { ... } @JsonPro
如何让 Jackson 的 XMLMapper 在反序列化时读取根 xml 元素的名称? 我正在将输入 XML 反序列化为通用 Java 类、LinkedHashMap,然后反序列化为 JSON。我想
我对抽象类和 JSON 序列化和反序列化的对象引用有问题。抽象的问题如下所示: 我有一个由节点和边组成的图。每条边连接两个节点。节点可以是红色和绿色的。因此,有一个抽象类Node和两个派生类 RedN
我是一名优秀的程序员,十分优秀!