GVKun编程网logo

Spring Boot自动JSON到控制器上的对象(springboot自带json)

18

在这里,我们将给大家分享关于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)

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到控制器,为什么?

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应用

我试图在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

小编典典

执行此步骤后,代码将转换为以下内容:

  1. 在pom.xml中,更改<packaging>jar</packaging><packaging>war</packaging>

  2. 在包中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);    }}
  1. 删除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>
  1. 排除Jetty依赖性,并包括Servlet API依赖性:

<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope></dependency>

  1. 添加App Engine标准插件:

    <plugin><groupId>com.google.cloud.tools</groupId><artifactId>appengine-maven-plugin</artifactId><version>1.3.1</version>

    1. 添加一个名为appengine-web.xmlsrc/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>
  1. 避免内存不足错误:

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>

编辑:

对于步骤37你也可以去项目浏览器(如果你使用Eclipse),然后导航到 图书馆- > Maven依赖与单独选择每个库(jul-to-slf4j-1.7.25spring-boot-starter-tomcat-1.5.3.RELEASE在我的情况)。右键单击每个库,然后转到
Maven- >排除Maven工件 …,然后单击“ 确定” 。这对POM的影响与编辑相同。

java – Spring Boot – 用于处理JSON或HTML的错误控制器

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方法,因为它是与原始控制器方法不同的返回类型).

这件事已经解决了吗?

最佳答案
问题是我自己的错.我试图弄清楚为什么我的@ExceptionHandler无法捕获我的异常并返回JSON – 正如我在问题的最后建议的那样,我认为由于返回类型冲突我遇到了问题 – 这是不正确的.

我试图让我的异常处理程序返回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连接器以绑定到控制器

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服务.

最佳答案
您可以为每个服务使用子应用程序,并通过设置其server.port属性将每个子节点配置为使用单独的端口.您想要隔离的任何组件都应该包含在其中一个子组件中.您要共享的任何组件都应该包含在父级中.

这是这种方法的一个例子.有两个子应用程序,一个侦听端口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连接器以绑定到控制器等更多相关知识的信息可以在本站进行查询。

本文标签: