Dropwizard REST问题

时间:2018-03-14 09:38:45

标签: java rest jersey dropwizard jdbi

我使用dropwizard(jersey,jackson)创建了一个REST API,偶然发现了一些我无法找到答案的问题。 我想基于json文件构建一个sql查询。这将通过地图(标准,值)完成。我有一些问题意识到这一点:

  • 调用DAO方法getUserByCriteria(Map / JSONObject)会给我这种类型的错误: UnsupportedOperationException:找不到已删除类型的类型参数'接口java.util.Map [K,V]'。要绑定泛型类型,请使用bindByType。 或者a" No Argument factory"我似乎无法重现atm的错误

代码:

UserResource:

@POST
@Path("/list")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public List<User> getUser(@Auth UserToken token, JSONObject json) {
return userDAO.getUserByCriteria(json);
}

userDAO的:

List<User> getInvoiceByCriteria(@Bind("json") JSONObject json);
  • 当我开始工作时,我该如何解决?我的代码看起来像这样(似乎不能为这个代码块设置代码块):

    @SqlQuery(&#34; SELECT * FROM user LIMIT 10&#34;)

    @RegisterRowMapper(UserMapper.class)

    列出getUserByCriteria(@Bind(&#34; json&#34;)Map json);

我想让它做到这样的事情:

@SqlQuery("SELECT * FROM user WHERE crit1 = :crit1 AND crit2 = :crit2 LIMIT 10")
@RegisterRowMapper(UserMapper.class)
List<User> getUserByCriteria(@Bind("json") Map json){
//EXTRACT VALUES OF MAP HERE
//
};

我意识到这是一个非常模糊的问题。问题是我在这个REST的东西上是一个非常大的菜鸟,我遇到的问题并不常见(或者我正在寻找错误的东西)。 非常感谢任何帮助/见解!

关于http / rest的Xtra问题: 我觉得这应该是一个GET请求而不是POST,但我的Advanced Rest Client不允许在GET请求中使用正文。我在网上发现这通常没有完成,但允许。在这里使用POST好吗?

2 个答案:

答案 0 :(得分:1)

我将首先回答您的Xtra问题:

GET的目标是使用URI中发送的URI和params检索数据。 b / w可以或应该有区别。它与Body with GET相同,你可以使用GET发送正文,但是你没有遵循HTTP指南,GET和POST的目的也是混合的。 &LT; Refer Here&GT;和&lt; here&gt;

现在在你的问题中。您正在

中发送JSONObject json
public List<User> getUser(@Auth UserToken token, JSONObject json) {
return userDAO.getUserByCriteria(json);
}

但是你与Map匹配。地图基本上是娱乐TypeErasure&lt;这意味着在编译代码时,您的集合的通用将被此&gt;的绑定对象替换。如有必要,您可以选择插入类型转换以保持类型安全。你也可以使用这样的东西

List<User> getInvoiceByCriteria(@Bind("json") Map<K extends String , V extends MyObject> json);

答案 1 :(得分:1)

以下是使用Mapper的DAO接口的简单示例:

@RegisterMapper(EmployeeMapper.class)
public interface EmployeeDao {

@SqlQuery("select * from employee;")
public List<Employee> getEmployees();

@SqlQuery("select * from employee where id = :id")
public Employee getEmployee(@Bind("id") final int id);

@SqlUpdate("insert into employee(name, department, salary) values(:name, :department, :salary)")
void createEmployee(@BindBean final Employee employee);

@SqlUpdate("update employee set name = coalesce(:name, name), " +
        " department = coalesce(:department, department), salary = coalesce(:salary, salary)" +
        " where id = :id")
void editEmployee(@BindBean final Employee employee);

@SqlUpdate("delete from employee where id = :id")
int deleteEmployee(@Bind("id") final int id);

@SqlQuery("select last_insert_id();")
public int lastInsertId();
}

以下是上面使用的Employee Mapper类:

public class EmployeeMapper implements ResultSetMapper<Employee> {
private static final String ID = "id";
private static final String NAME = "name";
private static final String DEPARTMENT = "department";
private static final String SALARY = "salary";

public Employee map(int i, ResultSet resultSet, StatementContext statementContext)
        throws SQLException {
    Employee employee = new Employee(resultSet.getString(NAME), resultSet.getString(DEPARTMENT),resultSet.getInt(SALARY));
    employee.setId(resultSet.getInt(ID));
    return employee;
}
}

我已经解释了如何使用JDBI,在博客文章中以简单的步骤在Dropwizard中创建REST API,还有一个我在GitHub上创建的示例工作应用程序。请检查:http://softwaredevelopercentral.blogspot.com/2017/08/dropwizard-mysql-integration-tutorial.html