在这里,我们将给大家分享关于SpringBoot自动JSON到控制器上的对象的知识,让您更了解springboot自带json的本质,同时也会涉及到如何更有效地asp.net-mvc–ASP.NETm
在这里,我们将给大家分享关于Spring Boot自动JSON到控制器上的对象的知识,让您更了解springboot自带json的本质,同时也会涉及到如何更有效地asp.net-mvc – ASP.NET mvc 4控制器参数始终为空时发送json到控制器,为什么?、Google App Engine标准环境-找不到控制器方法-Spring Boot应用、java – Spring Boot – 用于处理JSON或HTML的错误控制器、java – Spring-Boot:如何添加tomcat连接器以绑定到控制器的内容。
本文目录一览:- Spring Boot自动JSON到控制器上的对象(springboot自带json)
- asp.net-mvc – ASP.NET mvc 4控制器参数始终为空时发送json到控制器,为什么?
- Google App Engine标准环境-找不到控制器方法-Spring Boot应用
- java – Spring Boot – 用于处理JSON或HTML的错误控制器
- java – Spring-Boot:如何添加tomcat连接器以绑定到控制器
Spring Boot自动JSON到控制器上的对象(springboot自带json)
我有带有该依赖项的SpringBoot应用程序:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jersey</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
我在控制器上有一个方法,如下所示:
@RequestMapping(value = "/liamo", method = RequestMethod.POST)@ResponseBodypublic XResponse liamo(XRequest xRequest) { ... return something;}
我通过AJAX从HTML发送一个JSON对象,并带有XRequest类型对象的某些字段(这是一个没有任何注释的普通POJO)。但是,我的JSON并未在控制器方法中构造为object,并且其字段为null。
我想在控制器上进行自动反序列化时会错过什么?
答案1
小编典典Spring Boot附带了现成的Jackson,它将负责将JSON请求主体解编为Java对象
您可以使用@RequestBody Spring MVC批注将JSON字符串反序列化/解编为Java对象…例如。
例
@RestControllerpublic class CustomerController { //@Autowired CustomerService customerService; @RequestMapping(path="/customers", method= RequestMethod.POST) @ResponseStatus(HttpStatus.CREATED) public Customer postCustomer(@RequestBody Customer customer){ //return customerService.createCustomer(customer); }}
使用@JsonProperty和相应的json字段名称注释您的实体成员元素。
public class Customer { @JsonProperty("customer_id") private long customerId; @JsonProperty("first_name") private String firstName; @JsonProperty("last_name") private String lastName; @JsonProperty("town") private String town;}
asp.net-mvc – ASP.NET mvc 4控制器参数始终为空时发送json到控制器,为什么?
客户端javascript
function getChart() { JSONString3 = { HAxis : [{ Name : "monday" }] }; jQuery.ajaxSettings.Traditional = true; $.ajax({ url: "@Url.Action("getChart","SBM")",type: 'POST',contentType: 'json',dataType: 'html',data: JSONString3,success: function (data) { var imagestring = btoa(data); $('#Chartimage').attr('src',"data:image/png;base64," + imagestring + "?" + new Date().getTime()); } }) jQuery.ajaxSettings.Traditional = false; }
MVC控制器
[Authorize] [HttpPost] public ActionResult getChart(YAxis HAxis) { YAxis XAxisvalue = HAxis; Charts chart = new Charts(); MemoryStream ms = new MemoryStream(); chart.Chart.SaveImage(ms); string image = Convert.ToBase64String(ms.GetBuffer()); return File(ms.GetBuffer(),"image/png","Chart.png"); }
模型
public class YAxis { public string Name { get; set; } }
解决方法
解决问题的方法如下:
> contentType应该是application / json(如上面提到的Ant P)
> json数据应该是JSONString3 = {“Name”:“monday”}的形式(如上所述Ant P)
>发送给控制器之前,json应该被字符串化如下:JSONString3 = JSON.stringify(JSONString3)(如Quan建议)
客户端javascript
function getChart() { JSONString3 = { "Name" : "monday" }; jQuery.ajaxSettings.Traditional = true; $.ajax({ url: "@Url.Action("getChart",contentType: 'application/json',data: JSON.stringify(JSONString3),success: function (data) { var imagestring = btoa(data); $('#Chartimage').attr('src'," + imagestring + "?" + new Date().getTime()); } }) jQuery.ajaxSettings.Traditional = false; }
MVC控制器
[Authorize] [HttpPost] public ActionResult getChart(YAxis HAxis) { YAxis XAxisvalue = HAxis; Charts chart = new Charts(); MemoryStream ms = new MemoryStream(); chart.Chart.SaveImage(ms); string image = Convert.ToBase64String(ms.GetBuffer()); return File(ms.GetBuffer(),"Chart.png"); }
模型
public class YAxis { public string Name { get; set; } }
而不是这样:
JSONString3 = { "Name" : "monday" };
我们做得到:
var JSONString3 = {}; JSONString.Name = "monday";
但是我们还需要在发布给控制器之前对对象进行字符串化
To pass multiple objects to controller,below is the example
客户端javascript
function getChart() { //first json object //note: each object Property name must be the same as it is in the Models classes on server side Category = {}; Category.Name = "Category1"; Category.Values = []; Category.Values[0] = "CategoryValue1"; Category.Values[1] = "CategoryValue2"; //second json object XAxis = {}; XAxis.Name = "XAxis1"; XAxis.Values = []; XAxis.Values[0] = "XAxisValue1"; XAxis.Values[1] = "XAxisValue2"; //third json object YAxis = {}; YAxis.Name = "YAxis1"; //convert all three objects to string //note: each object name should be the same as the controller parameter is!! var StringToPost = JSON.stringify({CategoryObject : Category,XAxisObject : XAxis,YAxisObject : YAxis}); $.ajax({ url: "@Url.Action("getChart",contentType: "application/json",data: StringToPost,success: function (data) { var imagestring = btoa(data); $('#Chartimage').html(data); } }) }
MVC控制器
[HttpPost] public ActionResult getChart(Category CategoryObject,XAxis XAxisObject,YAxis YAxisObject) { //do some stuff with objects here and return something to client return PartialView("_Chart"); }
类别模型
public class Category { public string Name { get; set; } public List<string> Values { get; set; } }
XAxis模型
public class XAxis { public string Name { get; set; } public List<string> Values { get; set; } }
YAX模型
public class YAxis { public string Name { get; set; } }
希望能帮助人澄清整个画面!
Google App Engine标准环境-找不到控制器方法-Spring Boot应用
我试图在Google App Engine(标准环境)上部署Spring
Boot应用程序。首先,我从这个不错的教程https://springframework.guru/spring-boot-web-
application-part-4-spring-mvc/中克隆了示例应用程序
例如,我调用了http:// localhost:8080 /
products,显示了带有数据的模板。
因此一切运行都没有问题,我能够在本地调用所有控制器方法。然后,我决定作为实验将其部署在GAE上。我根据这里https://github.com/GoogleCloudPlatform/getting-
started-java/tree/master/appengine-standard-java8/springboot-appengine-
standard的说明调整了pom.xml
这意味着我排除了Tomcat依赖性,将包装从jar更改为war,创建了appengine-
web.xml文件等。下一步,我在GAE控制台中创建了GAE项目,并将APP ID复制到了appengine-web.xml中。然后,我运行了mvn
clean程序包,并在目标文件夹中创建了war。最终,我开始进行GAE部署,并且顺利进行且没有错误。
我的应用程序现已部署在此URL https://20180109t135551-dot-oe-gae-
test.appspot.com/
如果尝试,您将在浏览器中看到Hello World。但是如果我尝试像这样https://20180109t135551-dot-oe-gae-
test.appspot.com/products调用/ products控制器方法,则会收到“未找到”错误。
您能给我一些建议,告诉我应使用哪个URL的控制器方法吗?我是否忘记实现web.xml servlet映射之类的东西?还是某些特定的Spring Boot-
Google App Engine问题?
我将不胜感激。
谢谢大家
答案1
小编典典执行此步骤后,代码将转换为以下内容:
在pom.xml中,更改
<packaging>jar</packaging>
为<packaging>war</packaging>
在包中
guru.springframework
添加此类:
码:
package guru.springframework;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class SpringBootWebApplication {public static void main(String[] args) { SpringApplication.run(SpringBootWebApplication.class, args); }}
- 删除Tomcat Starter:
在POM中找到此依赖项:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
并添加以下行:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency>
- 排除Jetty依赖性,并包括Servlet API依赖性:
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope></dependency>
添加App Engine标准插件:
<plugin><groupId>com.google.cloud.tools</groupId><artifactId>appengine-maven-plugin</artifactId><version>1.3.1</version>
- 添加一个名为
appengine-web.xml
在src/webapp/WEB-INF
与这些内容:
- 添加一个名为
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0"><threadsafe>true</threadsafe> <runtime>java8</runtime> </system-properties></appengine-web-app>
7. 通过在pom中定位此依赖项来排除JUL到SLF4J桥:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
并以这种方式修改它:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId> </exclusion> </exclusions> </dependency>
- 避免内存不足错误:
在src/main/resources
添加带有以下内容的logging.properties文件中:
.level = INFO
并在其中src/main/webapp/WEB-INF/appengine-web.xml
粘贴:
<system-properties> <property name="java.util.logging.config.file" value="WEB-INF/classes/logging.properties" /></system-properties>
编辑:
对于步骤3
和7
你也可以去项目浏览器(如果你使用Eclipse),然后导航到 图书馆- > Maven依赖与单独选择每个库(jul-to-slf4j-1.7.25
和spring-boot-starter-tomcat-1.5.3.RELEASE
在我的情况)。右键单击每个库,然后转到
Maven- >排除Maven工件 …,然后单击“ 确定” 。这对POM的影响与编辑相同。
java – Spring Boot – 用于处理JSON或HTML的错误控制器
我有一个春季启动应用程序.
我有一个自定义错误控制器,映射到使用ErrorPage映射.映射主要基于HTTP状态代码,通常只是适当地呈现HTML视图.
例如,我的映射:
@Configuration
class ErrorConfiguration implements EmbeddedServletContainerCustomizer {
@Override public void customize( ConfigurableEmbeddedServletContainer container ) {
container.addErrorPages( new ErrorPage( HttpStatus.NOT_FOUND,"/error/404.html" ) )
}
我的错误控制器:
@Controller
@RequestMapping
public class ErrorController {
@RequestMapping( value = "/error/404.html" )
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public String pageNotFound( HttpServletRequest request ) {
"errors/404"
}
这很好 – 如果我只输入一个随机不存在的URL,那么它将呈现404页面.
现在,我想要一个我的网站的一部分,让我们说/ api / ..专用于我的JSON api将错误作为JSON提供,所以如果我在/ api / ..下输入一个随机不存在的URL,那么它返回404 JSON响应.
有没有标准/最好的方法来做到这一点?我试过的一个想法就是有一个@ControllerAdvice专门捕获了我定义的一类自定义API异常并返回了JSON,并且在我的标准ErrorController中检查URL并在该API URL空间下抛出apprpriate API异常(但是不起作用,因为无法调用ExceptionHandler方法,因为它是与原始控制器方法不同的返回类型).
这件事已经解决了吗?
我试图让我的异常处理程序返回JSON的错误是:
"exception": "org.springframework.web.HttpMediaTypeNotAcceptableException","message": "Could not find acceptable representation"
我做了一些挖掘/试验以试图缩小问题范围(认为问题是因为我在Spring错误处理流程和导致问题的ErrorController中),但问题只是因为内容协商东西春天呢.
因为我在web.xml中的errorPage映射映射到/error/404.html,所以Spring使用后缀来解析相应的视图 – 所以当我尝试返回json时它会失败.
我已经能够通过将我的web.xml更改为/ error / 404或关闭内容协商后缀选项来解决此问题.
java – Spring-Boot:如何添加tomcat连接器以绑定到控制器
在Spring-Boot文档中,有一节描述了如何为tomcat启用多个连接器(http://docs.spring.io/spring-boot/docs/1.1.7.RELEASE/reference/htmlsingle/#howto-enable-multiple-connectors-in-tomcat).
但有没有办法简单地将连接器添加到现有连接器(Web和管理连接器)?并将它们绑定到一些mvc控制器?
我想要做的是创建一些可以在不同端口上访问的Web服务.
这是这种方法的一个例子.有两个子应用程序,一个侦听端口8080,另一个侦听端口8081.每个应用程序包含一个控制器,分别映射到/ one和/ 2.
package com.example;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
public class Application {
public static void main(String[] args) {
SpringApplicationBuilder parentBuilder
= new SpringApplicationBuilder(ApplicationConfiguration.class);
parentBuilder.child(ServiceOneConfiguration.class)
.properties("server.port:8080").run(args);
parentBuilder.child(ServiceTwoConfiguration.class)
.properties("server.port:8081").run(args);
}
@Configuration
static class ApplicationConfiguration {
@Bean
public MySharedService sharedService() {
return new MySharedService();
}
}
@Configuration
@EnableAutoConfiguration
static class ServiceOneConfiguration {
@Bean
public ControllerOne controller(MySharedService service) {
return new ControllerOne(service);
}
}
@Configuration
@EnableAutoConfiguration
static class ServiceTwoConfiguration {
@Bean
public ControllerTwo controller(MySharedService service) {
return new ControllerTwo(service);
}
}
@RequestMapping("/one")
static class ControllerOne {
private final MySharedService service;
public ControllerOne(MySharedService service) {
this.service = service;
}
@RequestMapping
@ResponseBody
public String getMessage() {
return "ControllerOne says \"" + this.service.getMessage() + "\"";
}
}
@RequestMapping("/two")
static class ControllerTwo {
private final MySharedService service;
public ControllerTwo(MySharedService service) {
this.service = service;
}
@RequestMapping
@ResponseBody
public String getMessage() {
return "ControllerTwo says \"" + this.service.getMessage() + "\"";
}
}
static class MySharedService {
public String getMessage() {
return "Hello";
}
}
}
今天关于Spring Boot自动JSON到控制器上的对象和springboot自带json的介绍到此结束,谢谢您的阅读,有关asp.net-mvc – ASP.NET mvc 4控制器参数始终为空时发送json到控制器,为什么?、Google App Engine标准环境-找不到控制器方法-Spring Boot应用、java – Spring Boot – 用于处理JSON或HTML的错误控制器、java – Spring-Boot:如何添加tomcat连接器以绑定到控制器等更多相关知识的信息可以在本站进行查询。
本文标签: