Аннотированный тип @ManagedProperty возвращает ноль - PullRequest
2 голосов
/ 11 апреля 2011

У меня есть этот служебный компонент:

@Stateless
public class BookService
{
    @PersistenceContext(unitName="persistentUnit")
    protected EntityManager entityManager;

    public BookModel find(Long id) {
       return entityManager.find(BookModel.class, id);
    }
}

А базовый компонент страницы Facelet:

@ManagedBean(name = "bookBean")
@RequestScoped
public class BookBean implements Serializable
{
    @EJB
    private BookService bookService;

    @ManagedProperty(value="#{param.id}")
    private Long id;

    private DataModel<BookModel> books;
    private BookModel currentBook;

    @PostConstruct
    public void init() {
        if (id == null) {
           // UPDATE: Retrieve a list of books.
        } else { 
           // UPDATE: id shouldn't be null here.
           // Get detail info about a book using the id
           currentBook = bookService.find(id);
        }
    }

    public Long getId() {
       return id;
    } 

    public void setId(Long id) {
       this.id = id;
    } 

    public BookModel getCurrentBook() {
       return currentBook;
    }

    public void setCurrentBook(BookModel currentBook) {
       this.currentBook = currentBook;
    }
 }

Почему значение id всегда возвращает ноль, хотя URL-адрес возвращается как bookedit.jsf?id=5418 Я не понимаю этого.

Кроме того, я считаю метод EntityManager#find довольно ограничительным, поскольку он принимает в качестве второго параметра только значение первичного ключа. Что делать, если я хочу передать значение [хеш-код] вместо первичного ключа. Как я могу сделать это с помощью метода EntityManager#find?

P.S. Я заметил, что требование EntityManager#find одинаково для реализаций OpenJPA и EclipseLink. Хм ...

1 Ответ

2 голосов
/ 23 сентября 2011

Я только что попробовал это в одном из моих управляемых bean-компонентов, и он работает.Вот соответствующий код, он в основном совпадает с вашим:

@ManagedBean
@RequestScoped
public class TestBean {
    @ManagedProperty(value = "#{param.id}")
    private Long prop;

    @PostConstruct
    public void init() {
        System.out.println(prop);
        // prints 1234 if I go to the url with http://localhost/page.jsf?1234
    }

    public Long getProp() {
        return prop;
    }

    public void setProp(Long prop) {
        this.prop = prop;
    }
}

Я запускаю его на Glassfish 3.1.1.Единственная мысль, которая у меня возникла, - это, может быть, введенный EJB каким-то образом испортил область запроса в ManagedBean?

...