Rest Jersey JAX-RS Glassfish 4抛出java.lang.IllegalStateException

Rest Jersey JAX-RS Glassfish 4抛出java.lang.IllegalStateException,rest,glassfish-4.1,Rest,Glassfish 4.1,我正在创建一个简单的RESTful服务 @Path("/book") @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @Stateless public class RestBookService { @PersistenceContext(unitName="bookP

我正在创建一个简单的RESTful服务

@Path("/book")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Stateless
public class RestBookService {
    @PersistenceContext(unitName="bookPU")
    private EntityManager em;

    @Context
    protected UriInfo uriInfo;

    @POST
    public Response createBook(Book book) {
        if (book == null)
            throw new BadRequestException();
        em.persist(book);
        URI bookUri = uriInfo.getAbsolutePathBuilder().path(book.getId() + "").build();
        return Response.created(bookUri).build();
    }
}
这本书是简单的JPA实体

@Entity
@XmlRootElement
public class Book {

    static Logger log = Logger.getLogger(Book.class.getName());

    public static final String FIND_ALL = "Book.find_all";

    @Id
    @GeneratedValue
    private int id;

    @Column(nullable=false)
    private String title;

    @Column
    private Float price;
}
//只是给出一个相关的代码。有getter/setter和构造函数

我正在Glassfish 4.1上使用Maven部署该服务 我正在使用 泽西岛集装箱2.13 Hibernate 4.3.5最终版本 Mysql 5.1

当我尝试使用cURL创建一本书时,如下所示

curl -X POST --data-binary "<book><price>12.5</price><title>Book Title</title></book>" -H "Content-Type: application/xml" http://localhost:8080/book-service/rs/book -v 
[还有一个问题与此类似,但我所做的与答案中给出的完全相同。我仍然得到了例外。此外,我也经历了,但它似乎处于已解决状态,无法复制决议。]

谁能帮帮我吗

编辑1 我已经从无状态注释更改为@HankCa建议的RequestScope注释。它现在抛出以下异常

'javax.persistence.TransactionRequiredException
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.doTxRequiredCheck(EntityManagerWrapper.java:161)
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.doTransactionScopedTxCheck(EntityManagerWrapper.java:151)
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.persist(EntityManagerWrapper.java:281)
    at com.services.bookrestservice.rest.RestBookService.createBook(RestBookService.java:44)
' 
不确定为什么会出现此异常,因为它已在persistentcontext中

编辑2 @汉卡建议我做以下改变

除去

@Context
protected UriInfo uriInfo;
并将方法签名更新为

@POST
public Response createBook(Book book, @Context UriInfo uriInfo) {

而且服务正在按预期工作。谢谢HankCa的帮助。

是的,我盯着这个问题看了太久,我的解决方案和你在网站上找到的一样。这是一年前的事了,虽然我离开EJB已经有一段时间了,但我再也没有打过了,所以我会尽我最大的努力

具体来说,我会制作这些MOD:

添加@RequestScoped 将@Context UriInfo UriInfo放在方法或类中。最后,我似乎采用了如下方法: 这是代码,这是将列表与代码分开的一行,因此代码显示为代码

@Path("/user")
@Produces({ MediaType.APPLICATION_JSON })
@Consumes({ MediaType.APPLICATION_JSON })
@RequestScoped
public class UserResource {    
    ...
    @PermitAll
    @POST
    public Response signupUser(CreateUserRequest request, @Context UriInfo uriInfo) {
        AuthenticatedUserToken token = userService.createUser(request, Role.authenticated);
        verificationTokenService.sendEmailRegistrationToken(token.getUserId());
        URI location = uriInfo.getAbsolutePathBuilder().path(token.getUserId()).build();
        return Response.created(location).entity(token).build();
    }
我希望这有帮助

干杯


bbos

我已经在github上添加了该项目。这里是链接。邀请@HankCa,因为他之前也有类似的问题。如果我在这里遗漏了什么,请看一看。试着丢失UriInfo看看有什么不同。@HankCa。你就是那个人!我删除了UriInfo,并且能够通过restful服务创建和获取行。然后,我在方法中而不是类中注入了UriInfo,它成功了。所以这个问题的答案是从类中删除UriInfo并将其作为方法参数。恭喜!所以我的答案是正确的,你能这样打勾吗?另一件我想尝试的事情是JBoss Wildfly作为一种替代的开源web应用服务器,它不是操作系统本身,而是主要基于操作系统组件。新版本的Glassfish发布花了15个月的时间,虽然我希望它的支持已经获得了牵引力,但我会比较其他版本。感谢您快速来到这里,并为此投入一些时间。我将修改代码并将其签出。我在尝试RequestScope注释后添加了EDIT1。我还是有个例外。虽然不一样,但还是很奇怪
@Path("/user")
@Produces({ MediaType.APPLICATION_JSON })
@Consumes({ MediaType.APPLICATION_JSON })
@RequestScoped
public class UserResource {    
    ...
    @PermitAll
    @POST
    public Response signupUser(CreateUserRequest request, @Context UriInfo uriInfo) {
        AuthenticatedUserToken token = userService.createUser(request, Role.authenticated);
        verificationTokenService.sendEmailRegistrationToken(token.getUserId());
        URI location = uriInfo.getAbsolutePathBuilder().path(token.getUserId()).build();
        return Response.created(location).entity(token).build();
    }