Java Jackson JSON-“;无单字符串构造函数/工厂方法“;解组错误

Java Jackson JSON-“;无单字符串构造函数/工厂方法“;解组错误,java,json,spring-mvc,jackson,Java,Json,Spring Mvc,Jackson,最简单的情况就是给我带来麻烦。我第一次碰到它。我能够解组稍微复杂一点的json,但这个简单的json失败了 这是什么原因造成的?为什么杰克逊只用一根弦就有问题 包含用户角色名称的简单类 public class UpdateUserRole { private String name; public String getName() { return name; } public void setName(String name) {

最简单的情况就是给我带来麻烦。我第一次碰到它。我能够解组稍微复杂一点的json,但这个简单的json失败了

这是什么原因造成的?为什么杰克逊只用一根弦就有问题

包含用户角色名称的简单类

public class UpdateUserRole {
    private String name;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }    
}
控制器内部

public void updateUserRole(@PathVariable Long id, @RequestBody UpdateUserRoleReq req) {
}
杰克逊一看到这一点,就会抛出这个错误

org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not instantiate value of type [simple type, class com.mycompany.UpdateUserRoleReq] from String value ('{"name":"admin_1407445357682"}'); no single-String constructor/factory method; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class com.mycompany.UpdateUserRoleReq] from String value ('{"name":"admin_1407445357682"}'); no single-String constructor/factory method
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:228)
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.read(MappingJackson2HttpMessageConverter.java:220)
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:138)
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:183)
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:98)
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:79)
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:157)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:124)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    at org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:874)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:649)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:110)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration$ApplicationContextFilterConfiguration$1.doFilterInternal(EndpointWebMvcAutoConfiguration.java:257)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

通过严格遵守错误消息,我能够解决一个非常类似的问题

我在单字符串构造函数中添加了等效项

public class UpdateUserRole {

  private String name;

  public UpdateUserRole() {}

  public UpdateUserRole(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }    
}

我喜欢我的案子。我发送了双转义JSON字符串,例如“{\“name\”:“abc\”,“age\”:21}”,我的字符串构造函数只接收完整的JSON字符串。其他属性(年龄)根本没有更新。有一次,我将输入更改为{“name”:“abc”,“age”:21}。Jackson能够自动将JSON输入解析为对象。

您必须添加包含单个参数的构造方法。
试一试。

我为OAuth提供了Jira教程()。在我的例子中,我使用GSON lib进行dto到json的转换,但是我无法使其工作。稍后我将提供源代码,但为了快速解决问题,请参见:

你能发布你的JSON字符串吗?为了确定,你能确认当你说
UpdateUserRole
时,你的意思是
UpdateUserRoleReq
?@Alexey-不确定我如何共享JSON。它通过集成测试运行。除非我执行wireshark或其他操作,否则这是一个http请求。@ccjmne-是的。设置为正确使用UpdateUserRoleReq。如果我在UpdateUserRoleReq中创建一个构造函数,比如:UpdateUserRoleReq(字符串名),它就会开始工作。不知道为什么。我正在按照错误消息上的说明进行操作。它需要一个单个字符串的构造函数/工厂方法。@sat听起来像是用json字符串节点构造对象,而不是从对象节点。是的,上面的说法是正确的,我也遇到过同样的问题,当我创建单个字符串构造函数时,它工作了。你没有看到其他答案吗?