我创建了一个 Web 应用程序并从数据库中添加了实体类,然后从实体类生成了安静的服务。然后我添加了一个安静的 java 脚本客户端并开始使用它。对于 GET/PUT 方法,它按预期工作,但对于 create/POST 方法,会抛出错误为“无法满足请求”
用户登录.java
@Entity
@Table(name = "USERS_LOGIN", catalog = "D3Common", schema = "dbo")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "UsersLogin.findAll", query = "SELECT u FROM UsersLogin u")
, @NamedQuery(name = "UsersLogin.findByUserId", query = "SELECT u FROM UsersLogin u WHERE u.userId = :userId")
, @NamedQuery(name = "UsersLogin.findByUserPassword", query = "SELECT u FROM UsersLogin u WHERE u.userPassword = :userPassword")
, @NamedQuery(name = "UsersLogin.findByUserName", query = "SELECT u FROM UsersLogin u WHERE u.userName = :userName")
, @NamedQuery(name = "UsersLogin.findByFeatureGroup", query = "SELECT u FROM UsersLogin u WHERE u.featureGroup = :featureGroup")})
public class UsersLogin implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 10)
@Column(name = "USER_ID", nullable = false, length = 10)
private String userId;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 10)
@Column(name = "USER_PASSWORD", nullable = false, length = 10)
private String userPassword;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 10)
@Column(name = "USER_NAME", nullable = false, length = 10)
private String userName;
@Size(max = 10)
@Column(name = "FEATURE_GROUP", length = 10)
private String featureGroup;
public UsersLogin() {
}
public UsersLogin(String userId) {
this.userId = userId;
}
public UsersLogin(String userId, String userPassword, String userName) {
this.userId = userId;
this.userPassword = userPassword;
this.userName = userName;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getFeatureGroup() {
return featureGroup;
}
public void setFeatureGroup(String featureGroup) {
this.featureGroup = featureGroup;
}
@Override
public int hashCode() {
int hash = 0;
hash += (userId != null ? userId.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof UsersLogin)) {
return false;
}
UsersLogin other = (UsersLogin) object;
if ((this.userId == null && other.userId != null) || (this.userId != null && !this.userId.equals(other.userId))) {
return false;
}
return true;
}
@Override
public String toString() {
return "d.UsersLogin[ userId=" + userId + " ]";
}
}
AbstarctFaced.java
public abstract class AbstractFacade<T> {
private Class<T> entityClass;
public AbstractFacade(Class<T> entityClass) {
this.entityClass = entityClass;
}
protected abstract EntityManager getEntityManager();
public void create(T entity) {
getEntityManager().persist(entity);
}
public void edit(T entity) {
getEntityManager().merge(entity);
}
public void remove(T entity) {
getEntityManager().remove(getEntityManager().merge(entity));
}
public T find(Object id) {
return getEntityManager().find(entityClass, id);
}
public List<T> findAll() {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
return getEntityManager().createQuery(cq).getResultList();
}
public List<T> findRange(int[] range) {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
javax.persistence.Query q = getEntityManager().createQuery(cq);
q.setMaxResults(range[1] - range[0] + 1);
q.setFirstResult(range[0]);
return q.getResultList();
}
public int count() {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
javax.persistence.criteria.Root<T> rt = cq.from(entityClass);
cq.select(getEntityManager().getCriteriaBuilder().count(rt));
javax.persistence.Query q = getEntityManager().createQuery(cq);
return ((Long) q.getSingleResult()).intValue();
}
}
ApplicationConfig.java
@javax.ws.rs.ApplicationPath("webresources")
public class ApplicationConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new java.util.HashSet<>();
addRestResourceClasses(resources);
return resources;
}
/**
* Do not modify addRestResourceClasses() method.
* It is automatically populated with
* all resources defined in the project.
* If required, comment out calling this method in getClasses().
*/
private void addRestResourceClasses(Set<Class<?>> resources) {
resources.add(filt.NewCrossOriginResourceSharingFilter.class);
resources.add(service.UsersLoginFacadeREST.class);
}
}
用户登录外观REST
@Stateless //**Getting error at this line**
@Path("d.userslogin")
public class UsersLoginFacadeREST extends AbstractFacade<UsersLogin> {
@PersistenceContext(unitName = "dddPU")
private EntityManager em;
public UsersLoginFacadeREST() {
super(UsersLogin.class);
}
@POST
@Override
@Consumes({MediaType.APPLICATION_JSON})
public void create(UsersLogin entity) {
super.create(entity);
}
@PUT
@Path("{id}")
@Consumes({ MediaType.APPLICATION_JSON})
public void edit(@PathParam("id") String id, UsersLogin entity) {
super.edit(entity);
}
@DELETE
@Path("{id}")
public void remove(@PathParam("id") String id) {
super.remove(super.find(id));
}
@GET
@Path("{id}")
@Produces({ MediaType.APPLICATION_JSON})
public UsersLogin find(@PathParam("id") String id) {
return super.find(id);
}
@GET
@Override
@Produces({ MediaType.APPLICATION_JSON})
public List<UsersLogin> findAll() {
return super.findAll();
}
@GET
@Path("{from}/{to}")
@Produces({ MediaType.APPLICATION_JSON})
public List<UsersLogin> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) {
return super.findRange(new int[]{from, to});
}
@GET
@Path("count")
@Produces(MediaType.TEXT_PLAIN)
public String countREST() {
return String.valueOf(super.count());
}
@Override
protected EntityManager getEntityManager() {
return em;
}
}
RestClient.js
var app = {
// Create this closure to contain the cached modules
module: function () {
// Internal module cache.
var modules = {};
// Create a new module reference scaffold or load an
// existing module.
return function (name) {
// If this module has already been created, return it.
if (modules[name]) {
return modules[name];
}
// Create a module and save it under this name
return modules[name] = {Views: {}};
};
}()
};
(function (models) {
// Model for UsersLogin entity
models.UsersLogin = Backbone.Model.extend({
urlRoot: "http://localhost:8080/ddd/webresources/d.userslogin/",
idAttribute: 'userId',
defaults: {
userPassword: "",
featureGroup: "",
userName: ""
},
toViewJson: function () {
var result = this.toJSON(); // displayName property is used to render item in the list
result.displayName = this.get('userId');
return result;
},
isNew: function () {
// default isNew() method imlementation is
// based on the 'id' initialization which
// sometimes is required to be initialized.
// So isNew() is rediefined here
return this.notSynced;
},
sync: function (method, model, options) {
options || (options = {});
var errorHandler = {
error: function (jqXHR, textStatus, errorThrown) {
// TODO: put your error handling code here
// If you use the JS client from the different domain
// (f.e. locally) then Cross-origin resource sharing
// headers has to be set on the REST server side.
// Otherwise the JS client has to be copied into the
// some (f.e. the same) Web project on the same domain
alert('Unable to fulfil the request');
}
};
if (method === 'create') {
options.url = 'http://localhost:8080/ddd/webresources/d.userslogin/';
}
var result = Backbone.sync(method, model, _.extend(options, errorHandler));
return result;
}
});
// Collection class for UsersLogin entities
models.UsersLoginCollection = Backbone.Collection.extend({
model: models.UsersLogin,
url: "http://localhost:8080/ddd/webresources/d.userslogin/",
sync: function (method, model, options) {
options || (options = {});
var errorHandler = {
error: function (jqXHR, textStatus, errorThrown) {
// TODO: put your error handling code here
// If you use the JS client from the different domain
// (f.e. locally) then Cross-origin resource sharing
// headers has to be set on the REST server side.
// Otherwise the JS client has to be copied into the
// some (f.e. the same) Web project on the same domain
alert('Unable to fulfil the request');
}
};
var result = Backbone.sync(method, model, _.extend(options, errorHandler));
return result;
}
});
})(app.module("models"));
(function (views) {
views.ListView = Backbone.View.extend({
tagName: 'tbody',
initialize: function (options) {
this.options = options || {};
this.model.bind("reset", this.render, this);
var self = this;
this.model.bind("add", function (modelName) {
var row = new views.ListItemView({
model: modelName,
templateName: self.options.templateName
}).render().el;
$(self.el).append($(row));
$(self.el).parent().trigger('addRows', [$(row)]);
});
},
render: function (eventName) {
var self = this;
_.each(this.model.models, function (modelName) {
$(this.el).append(new views.ListItemView({
model: modelName,
templateName: self.options.templateName
}).render().el);
}, this);
return this;
}
});
views.ListItemView = Backbone.View.extend({
tagName: 'tr',
initialize: function (options) {
this.options = options || {};
this.model.bind("change", this.render, this);
this.model.bind("destroy", this.close, this);
},
template: function (json) {
/*
* templateName is element identifier in HTML
* $(this.options.templateName) is element access to the element
* using jQuery
*/
return _.template($(this.options.templateName).html())(json);
},
render: function (eventName) {
$(this.el).html(this.template(this.model.toJSON()));
return this;
},
close: function () {
var table = $(this.el).parent().parent();
table.trigger('disable.pager');
$(this.el).unbind();
$(this.el).remove();
table.trigger('enable.pager');
}
});
views.ModelView = Backbone.View.extend({
initialize: function (options) {
this.options = options || {};
this.model.bind("change", this.render, this);
},
render: function (eventName) {
$(this.el).html(this.template(this.model.toJSON()));
return this;
},
template: function (json) {
/*
* templateName is element identifier in HTML
* $(this.options.templateName) is element access to the element
* using jQuery
*/
return _.template($(this.options.templateName).html())(json);
},
/*
* Classes "save" and "delete" are used on the HTML controls to listen events.
* So it is supposed that HTML has controls with these classes.
*/
events: {
"change input": "change",
"click .save": "save",
"click .delete": "drop"
},
change: function (event) {
var target = event.target;
console.log('changing ' + target.id + ' from: ' + target.defaultValue + ' to: ' + target.value);
},
save: function () {
// TODO : put save code here
var hash = this.options.getHashObject();
this.model.set(hash);
if (this.model.isNew() && this.collection) {
var self = this;
this.collection.create(this.model, {
success: function () {
// see isNew() method implementation in the model
self.model.notSynced = false;
self.options.navigate(self.model.id);
}
});
} else {
this.model.save();
this.model.el.parent().parent().trigger("update");
}
return false;
},
drop: function () {
this.model.destroy({
success: function () {
/*
* TODO : put your code here
* f.e. alert("Model is successfully deleted");
*/
window.history.back();
}
});
return false;
},
close: function () {
$(this.el).unbind();
$(this.el).empty();
}
});
// This view is used to create new model element
views.CreateView = Backbone.View.extend({
initialize: function (options) {
this.options = options || {};
this.render();
},
render: function (eventName) {
$(this.el).html(this.template());
return this;
},
template: function (json) {
/*
* templateName is element identifier in HTML
* $(this.options.templateName) is element access to the element
* using jQuery
*/
return _.template($(this.options.templateName).html())(json);
},
/*
* Class "new" is used on the control to listen events.
* So it is supposed that HTML has a control with "new" class.
*/
events: {
"click .new": "create"
},
create: function (event) {
this.options.navigate();
return false;
}
});
})(app.module("views"));
$(function () {
var models = app.module("models");
var views = app.module("views");
var AppRouter = Backbone.Router.extend({
routes: {
'': 'list',
'new': 'create'
,
':id': 'details'
},
initialize: function () {
var self = this;
$('#create').html(new views.CreateView({
// tpl-create is template identifier for 'create' block
templateName: '#tpl-create',
navigate: function () {
self.navigate('new', true);
}
}).render().el);
},
list: function () {
this.collection = new models.UsersLoginCollection();
var self = this;
this.collection.fetch({
success: function () {
self.listView = new views.ListView({
model: self.collection,
// tpl-userslogin-list-itemis template identifier for item
templateName: '#tpl-userslogin-list-item'
});
$('#datatable').html(self.listView.render().el).append(_.template($('#thead').html())());
if (self.requestedId) {
self.details(self.requestedId);
}
var pagerOptions = {
// target the pager markup
container: $('.pager'),
// output string - default is '{page}/{totalPages}'; possiblevariables: {page}, {totalPages},{startRow}, {endRow} and {totalRows}
output: '{startRow} to {endRow} ({totalRows})',
// starting page of the pager (zero based index)
page: 0,
// Number of visible rows - default is 10
size: 10
};
$('#datatable').tablesorter({widthFixed: true,
widgets: ['zebra']}).
tablesorterPager(pagerOptions);
}
});
},
details: function (id) {
if (this.collection) {
this.userslogin = this.collection.get(id);
if (this.view) {
this.view.close();
}
var self = this;
this.view = new views.ModelView({
model: this.userslogin,
// tpl-userslogin-details is template identifier for chosen model element
templateName: '#tpl-userslogin-details',
getHashObject: function () {
return self.getData();
}
});
$('#details').html(this.view.render().el);
} else {
this.requestedId = id;
this.list();
}
},
create: function () {
if (this.view) {
this.view.close();
}
var self = this;
var dataModel = new models.UsersLogin();
// see isNew() method implementation in the model
dataModel.notSynced = true;
this.view = new views.ModelView({
model: dataModel,
collection: this.collection,
// tpl-userslogin-details is a template identifier for chosen model element
templateName: '#tpl-userslogin-details',
navigate: function (id) {
self.navigate(id, false);
},
getHashObject: function () {
return self.getData();
}
});
$('#details').html(this.view.render().el);
},
getData: function () {
return {
userId: $('#userId').val(),
userPassword: $('#userPassword').val(),
featureGroup: $('#featureGroup').val(),
userName: $('#userName').val()
};
}
});
new AppRouter();
Backbone.history.start();
});
请帮助解决此问题