当前位置: 首页 > 知识库问答 >
问题:

Spring RESTFul客户端-RESTTemplate。有什么奇怪的事情,请告诉我

江仲渊
2023-03-14

我正在使用ResTemplate在客户端发布用户对象。但当我使用方法postForObject时,会出现未解决的编译问题类型RestTemplate中的方法postForObject(URI,Object,Class )不适用于参数(URL,User,Class ) 。我真的不明白???

public class RestClientTest {

    public static void main(String[] args) throws IOException{
//      System.out.println("Rest Response" + loadUser("quypham"));
//      URL url = new URL("http://localhost:8080/rest/user/create");
//      rt.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
//      rt.getMessageConverters().add(new StringHttpMessageConverter());
//      Map<String,String> vars = new HashMap<String,String>();

        RestTemplate rt = new RestTemplate();
        User user = new User();
        user.setUserName("datpham");
        user.setPassWord("12345");
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR,1960);
        user.setBirthDay(calendar.getTime());
        user.setAge(12);
        String uri = new String("http://localhost:8080/rest/user/create");
        User returns = rt.postForObject(uri, user,User.class);

//      createUser(user);
        System.out.println("Rest Response" + loadUser("datpham"));
    }

此处文件UserRestServiceController

@Controller
public class UserRestServiceController {
    @Autowired
    public  UserDao userDao;
    @RequestMapping(value = "/rest/user/create",method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.CREATED)
    public void addUser(@RequestBody User user){
        userDao.save(user);
    }

我已编辑字符串URI但遇到以下新错误:

2016年3月29日1:57:43 PM org.springframework.web.client.RestTemplate handleResponseError警告:“http://localhost:8080/rest/user/create”的POST请求导致400(错误请求);线程“main”org.springframework.web.client.httpclienterrorexception:400 org.springframework.web.client.defaultresponseerror(defaultresponseerror(defaultresponseerror(defaultresponseerror(defaultresponseerror(defaultresponseerror:91)org.springframework.web.client.resttemplate.java:588)org.springframework.web.client.resttemplate.java:588)org.springframework.web.client.resttemplate.doexecute(对象(restTemplate.java:330)位于edu.java.spring.service.client.restClientTest.main(restClientTest.java:45)

此处为user.java

@Entity
@Table(name = "brotheruser",uniqueConstraints={@UniqueConstraint(columnNames="username")})
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
//  @Enumerated(EnumType.STRING)
//  @Column(name = "gender", nullable = false)
//   
//  public Gender getGender() {
//      return gender;
//  }
//  public void setGender(Gender gender) {
//      this.gender = gender;
//  }
    @Id
    @Column(name = "username", unique = true, nullable = false)
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    @Column(name = "password", nullable = false)
    public String getPassWord() {
        return passWord;
    }
    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
    @JsonSerialize(using = DateSerializer.class)
//  @JsonDeserialize(using = DateDeserializer.class)
    @Column(name = "birthday", nullable = false)
    public Date getBirthDay() {


        return birthDay;
    }

    public void setBirthDay(Date birthDay) {
        this.birthDay = birthDay;
    }
    @Column(name="age", nullable = false)
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    private String userName;
    private String passWord;
    private Date birthDay;
    private Integer age;

//  private Gender gender;


}

共有1个答案

龙逸清
2023-03-14

好的。我现在不能给出正确的答案。我猜你的User类中有THT。问题是HTTP400错误,您必须在服务器端捕获一个详细的错误消息--以便知道到底是什么!出差错了。在spring中使用@ControllerAdvide定义一个globale异常处理程序(这将帮助您完成所有编程)。并不复杂!只需将这两个类复制并粘贴到您的项目中,并确保它们得到执行,您将在控制台或http日志文件上获得错误的详细输出(如果您没有访问控制台的权限

希望这有帮助..

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.HttpMediaTypeNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.NoHandlerFoundException;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import org.springframework.web.servlet.mvc.method.annotation.*;
import java.util.ArrayList;
import java.util.List;

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
    @Override
    protected ResponseEntity<Object> handleNoHandlerFoundException(NoHandlerFoundException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        return super.handleNoHandlerFoundException(ex, headers, status, request);
    }

    @Override
    protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
        return super.handleExceptionInternal(ex, body, headers, status, request);
    }

    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {

        List<FieldError> fieldErrors = ex.getBindingResult().getFieldErrors();
        List<ObjectError> globalErrors = ex.getBindingResult().getGlobalErrors();
        List<String> errors = new ArrayList<>(fieldErrors.size() + globalErrors.size());
        String error;
        for (FieldError fieldError : fieldErrors) {
            error = fieldError.getField() + ", " + fieldError.getDefaultMessage();
            errors.add(error);
        }
        for (ObjectError objectError : globalErrors) {
            error = objectError.getObjectName() + ", " + objectError.getDefaultMessage();
            errors.add(error);
        }
        RestResponseErrorMessage errorMessage = new RestResponseErrorMessage(errors);
        return new ResponseEntity(errorMessage, headers, status);
    }

    @Override
    protected ResponseEntity<Object> handleHttpMediaTypeNotSupported(HttpMediaTypeNotSupportedException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        String unsupported = "Unsupported content type: " + ex.getContentType();
        String supported = "Supported content types: " + MediaType.toString(ex.getSupportedMediaTypes());
        RestResponseErrorMessage errorMessage = new RestResponseErrorMessage(unsupported, supported);
        return new ResponseEntity(errorMessage, headers, status);
    }

    @Override
    protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        Throwable mostSpecificCause = ex.getMostSpecificCause();
        RestResponseErrorMessage errorMessage;
        if (mostSpecificCause != null) {
            String exceptionName = mostSpecificCause.getClass().getName();
            String message = mostSpecificCause.getMessage();
            errorMessage = new RestResponseErrorMessage(exceptionName, message);
        } else {
            errorMessage = new RestResponseErrorMessage(ex.getMessage());
        }
        return new ResponseEntity(errorMessage, headers, status);
    }
}
import javax.xml.bind.annotation.XmlRootElement;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * Created by pk on 08.03.2016.
 */
@XmlRootElement
public class RestResponseErrorMessage {


        private List<String> errors;

        public RestResponseErrorMessage() {
        }

        public RestResponseErrorMessage(List<String> errors) {
            this.errors = errors;
        }

        public RestResponseErrorMessage(String error) {
            this(Collections.singletonList(error));
        }

        public RestResponseErrorMessage(String ... errors) {
            this(Arrays.asList(errors));
        }

        public List<String> getErrors() {
            return errors;
        }

        public void setErrors(List<String> errors) {
            this.errors = errors;
        }
    }
 类似资料:
  • 问题内容: 如果我在SQL Server Express 2008上运行此查询: 它将日期存储为2011年4月11日 我该如何预防呢? 问题答案: 使用ISO-8601格式:(或)-无论您使用哪种SQL Server语言和区域设置,它始终有效。 SQL Server中的日期 不 以任何特定的面向字符串的格式存储-日期即是日期即是日期,无论您看到什么。 您会看到日期的字符串表示形式-但又一次:日期

  • 我有一个客户端应用程序与外部方应用程序通信。客户端应用程序已启动并长时间运行。 最近,我从运行我的客户机应用程序的应用程序服务器收到一个请求,询问允许的SSL/TLS协议,并调用他们的应用程序。 问题 2.1-服务器摘要>Server_1>协议 2.2-服务器摘要>Server_1>配置>SSL -----更新-----

  • 这里是HBase/Hadoop的超级新版本。我启动并运行了一个两节点HBase测试集群,现在我正尝试从一个远程Java客户端连接到该集群。这里是我陷入困境的地方:客户端成功地连接到单服务器Zookeeper仲裁(与HBase主服务器运行在同一服务器上),但是Zookeeper传递回客户端的地址是localhost,而且(很明显)客户端无法连接到任何东西,因为HBase不在本地运行。考虑到由于管理原

  • 问题内容: 我正在用Java编写一个简单的客户端,以允许可重用​​通过RESTful API访问的专有病毒扫描软件。要上传文件以扫描API,需要先使用Connect(连接),然后再要求将文件发布到服务器。在对Connect的响应中,服务器设置了cookie,随后将需要cookie 来发布文件。我当前在客户端中使用Spring 。 我的问题是我如何访问响应中的cookie,以便随后将其转发回服务器?

  • 我正在使用获取对象。但是当我在客户端运行Main时出现错误,请告诉我如何修复它??? 线程“main”org.springframework.http.converter.httpMessageNotreadableException:无法读取JSON:无法将edu.java.spring.service.user.model.user实例反序列化出START_ARRAY令牌[source:sun