java – JsonView与Spring无法正常工作
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – JsonView与Spring无法正常工作,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含9578字,纯文字阅读大概需要14分钟。
内容图文
我正在使用Spring启动来创建一个安静的api服务.一切正常,除了我不能指定哪些数据作为JSON返回.
我想要的是获得没有字段“content”的输出(在我的例子中用于存储对象).
Spring版本是4.2.5
这就是为什么我定义了3个级别的视图(内部是在数据库中获取/设置对象时使用的内容,Public是要输出到客户端的最小数据):
public class EntityVisibility {
public static class Public { }
public static class Detailed extends Public { }
public static class Internal extends Detailed { }
}
我的控制器:
@RestController
@RequestMapping("/api/photos")
public class PhotoController extends BaseController {
@JsonView(EntityVisibility.Public.class)
@RequestMapping(value="/load", method= RequestMethod.GET)
public Response<Photo> loadFromUrl(@RequestParam("url") String urlAddress) {
Photo photo = ...; // create photo object
return new Response<>(photo);
}
}
对我来说,看起来@JsonView(EntityVisibility.Public.class)现在正在运行.
响应类(仅限相关部分):
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Response<T> {
private T result;
public Response(T response) {
result = response;
}
}
我的Photo类(相关部分):
public class Photo extends Entity {
@JsonIgnore
protected byte[] content;
@JsonView(EntityVisibility.Public.class)
private Date modified;
@JsonProperty("content")
@JsonView(EntityVisibility.Internal.class)
public void setB64content(String b64content) {
this.content = (b64content == null) ? null : Base64.decode(b64content.getBytes());
}
public String getB64content() {
try {
return (content.length == 0) ? null : new String(Base64.encode(content), "UTF-8");
} catch (UnsupportedEncodingException e) {
return null;
}
}
public byte[] getContent() {
return content;
}
public void setContent(byte[] content) {
this.content = content;
}
}
实体类(相关部分):
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Entity {
}
我得到了什么:
{ “成功”:真, “结果”:{ “MIME_TYPE”: “图像/ PNG”, “内容”: “SOME_CONTENT_HERE”}}
预期结果:
{ “成功”:真, “结果”:{ “MIME_TYPE”: “图像/ PNG”}}
任何帮助是极大的赞赏!
==编辑==
我创建了一个新的非常简单的设置,但它仍然不适合我:
@RestController中的方法:
@JsonView(EntityVisibility.Public.class)
@RequestMapping(value="/test", method= RequestMethod.GET)
public Response<TestObject> testMethos() {
TestObject testObject = new TestObject();
testObject.setTest1("test1");
testObject.setTest2("test2");
testObject.setTest3("test3");
return new Response<>(testObject);
}
测试类:
public class TestObject {
@JsonView(EntityVisibility.Public.class)
private String test1;
@JsonView(EntityVisibility.Detailed.class)
private String test2;
@JsonView(EntityVisibility.Internal.class)
private String test3;
@JsonIgnore
private String test4;
public String getTest1() {
return test1;
}
public void setTest1(String test1) {
this.test1 = test1;
}
public String getTest2() {
return test2;
}
public void setTest2(String test2) {
this.test2 = test2;
}
public String getTest3() {
return test3;
}
public void setTest3(String test3) {
this.test3 = test3;
}
public String getTest4() {
return test4;
}
public void setTest4(String test4) {
this.test4 = test4;
}
}
我的pom.xml(完整版):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ch.sumli</groupId>
<artifactId>SumliCore</artifactId>
<version>0.1</version>
<packaging>war</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.couchbase.client</groupId>
<artifactId>java-client</artifactId>
<version>2.2.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>4.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.2.Final</version>
</dependency>
<dependency>
<groupId>jmimemagic</groupId>
<artifactId>jmimemagic</artifactId>
<version>0.1.2</version>
</dependency>
<dependency>
<groupId>org.imgscalr</groupId>
<artifactId>imgscalr-lib</artifactId>
<version>4.2</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.2</version>
</dependency>
</dependencies>
<properties>
<start-class>ch.sumli.Application</start-class>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.7</java.version>
</properties>
<repositories>
<repository>
<id>couchbase</id>
<name>couchbase repo</name>
<url>http://files.couchbase.com/maven2</url>
<snapshots><enabled>false</enabled></snapshots>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
我仍然得到一切(除了@JsonIgnore):
{"success":true,"result":{"test1":"test1","test2":"test2","test3":"test3"}}
解决方法:
在与@kkazakov的评论部分讨论之后,似乎问题出现在来自不同Jackson库版本的@JsonView中:
Turns out, Couchbase library also has Jackson inside. And the package
name is completely different. So, I was using @JsonView from couchbase
package, and Jackson from Spring.
老帖子:
我测试了你的代码,我觉得它对我有用.至少我看不到内容并得到了理想的json.唯一的区别是响应< T>类中的@JsonView(EntityVisibility.Public.class),但我认为你也有它,否则你将获得空对象
这是演示项目.您可以在设备上测试或指向我不同的设置.
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonView;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
public static class EntityVisibility {
public static class Public { }
public static class Detailed extends Public { }
public static class Internal extends Detailed { }
}
@RestController
public static class MyRestController {
@JsonView(EntityVisibility.Public.class)
@RequestMapping(value="/", method= RequestMethod.GET)
public Response<Photo> loadFromUrl() {
Photo photo = new Photo(); // create photo object
photo.setB64content("dfgsdfgsdfg");
photo.setMime_type("image/png");
System.out.println(photo);
return new Response<>(photo);
}
}
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class Response<T> {
@JsonView(EntityVisibility.Public.class)
private T result;
@JsonView(EntityVisibility.Public.class)
private boolean success = true;
@JsonView(EntityVisibility.Public.class)
private Object error;
@JsonView(EntityVisibility.Public.class)
private String errorCode;
@JsonView(EntityVisibility.Public.class)
private String message;
public T getResult() {
return result;
}
public void setResult(T result) {
this.result = result;
}
public Response(T response) {
result = response;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public Object getError() {
return error;
}
public void setError(Object error) {
this.error = error;
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
public static class Photo extends Entity {
@JsonIgnore
protected byte[] content;
@JsonView(EntityVisibility.Public.class)
private Date modified;
@JsonView(EntityVisibility.Public.class)
private String mime_type;
@JsonProperty("content")
@JsonView(EntityVisibility.Internal.class)
public void setB64content(String b64content) {
this.content = (b64content == null) ? null : b64content.getBytes();
}
public String getB64content() {
return (content.length == 0) ? null : Base64.encode(content);
}
public byte[] getContent() {
return content;
}
public void setContent(byte[] content) {
this.content = content;
}
public Date getModified() {
return modified;
}
public void setModified(Date modified) {
this.modified = modified;
}
public String getMime_type() {
return mime_type;
}
public void setMime_type(String mime_type) {
this.mime_type = mime_type;
}
@Override
public String toString() {
return "Photo{" +
"content=" + Arrays.toString(content) +
", modified=" + modified +
'}';
}
}
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class Entity {
}
}
127.0.0.1:8080的结果是:
{
"result": {
"mime_type": "image/png"
},
"success": true
}
内容总结
以上是互联网集市为您收集整理的java – JsonView与Spring无法正常工作全部内容,希望文章能够帮你解决java – JsonView与Spring无法正常工作所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。