当数据库中的记录为空时,向用户显示消息而不是HTML上的空JSON

时间:2018-02-19 16:23:09

标签: html json spring rest spring-restcontroller

我有一个应用程序,我有一个html页面,通过文本框接受用户输入。这是一个REST Spring框架,分为Controller,Entity,Service,Repository,View和主应用程序类。

我接受一个输入值并在Mongodb数据库中搜索,如果该值存在,我将实体对象从Service返回到Controller。控制器返回相同的Entity View对象.-在这种情况下为PersonView。我得到了一个JSON数据。

只要数据库中有记录,上述方案就可以正常工作。如果记录不存在,则返回空JSON。我的Controller返回Person View Object,我不希望更改签名并将返回类型设为String,因为在这种情况下它返回HTML页面上的地址。 考虑到这一点,当数据库中没有记录时我应该如何处理这种情况,并且我希望在同一个HTML页面上显示一条消息,说明没有可用的记录。

我尝试抛出异常,但在这种情况下,如何在我的HTML上显示消息,因为我的Controller返回JSON对象而我不想更改其签名?

控制器类如下:

 public PersonView searchPerson(@PathVariable String pname) {
      List<Person> pList= PersonService.searchPerson(pname);
       PersonView personView = new PersonView();

    personView.setPersonView(pList);



    return personView;

编辑:

这是我在Controller中调用的personView类的函数:

  public List<Person> setPersonView() {
    this.personView = personView;
}

这是服务Impl类:

    public List<Person> searchPerson(String name) throws Exception {

         List<Person> personlist= new ArrayList<Person>();
       personlist = personRepository.findByName(name);
     if (personlist.isEmpty()) 
            throw new Exception("Records not found in the the database");


        return personlist;

    }

2 个答案:

答案 0 :(得分:0)

创建自定义Exception类:

public class EntityNotFoundException extends RuntimeException {

    public EntityNotFoundException(String message) {
        super(message);
    }
}

现在,在您的控制器代码中:

public List<Person> searchPerson(String name) {

     List<Person> personlist= new ArrayList<Person>();
     personlist = personRepository.findByName(name);
     if (personlist.isEmpty()) {
        throw new EntityNotFoundException("Records not found in the the database");
     }
     return personlist;
}

之后你可以在控制器类中尝试这样的事情:

private static final MappingJacksonJsonView JSON_VIEW = new MappingJacksonJsonView();

@ExceptionHandler(EntityNotFoundException.class)
public ModelAndView handleNotFoundException( Exception ex )
{
    return new ModelAndView(JSON_VIEW, "error", new ErrorMessage("No Record in Db") );
}

您的ErrorMessage类可以是一个简单的POJO:

public class ErrorMessage {
    private String message;
    ErrorMessage(String message) {
        this.message = message;
    }
    public String getMessage() {
        return message;
    }
}

答案 1 :(得分:0)

虽然已经回答,但我会在这里添加一些观点。

请注意,在某些时候您需要发送 标题,响应主体(使用不同的对象)。因此,请考虑使用ResponseEntity Object,它将成为List的包装器。这是示例代码。

public  ResponseEntity<List<Person>> searchPerson(String name) {

 List<Person> personlist= new ArrayList<Person>();
 personlist = personRepository.findByName(name);
 if (personlist.isEmpty()) {
  return new ResponseEntity(new EntityNotFoundException("Records not found in the the database"), HttpStatus.BAD_REQUEST);
 }
 return new ResponseEntity(personlist , HttpStatus.OK);
}

响应实体对象在更大程度上提供了灵活性。阅读此处的文档。 https://docs.spring.io/spring/docs/current/javadocapi/org/springframework/http/ResponseEntity.html