2015-05-02 7 views
2

я не могу отобразить изображения из моей базы данных, они хранятся в виде BYTEA и я их отображения, как это:о: graphicImage бросает java.lang.IllegalArgumentException: аргумент типа несоответствия

@Entity 
@Table(name = "photograph", schema = "public") 
public class Photograph{ 
    private PhotographId id; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "diagnostic_id", nullable = false, insertable = false, updatable = false) 
    private Diagnostic diagnostic; 

    @Column(name = "photograph_content_type") 
    private String photographContentType; 

    @EmbeddedId 
    @AttributeOverrides({ 
     @AttributeOverride(name = "diagnosticId", column = @Column(name = "diagnostic_id", nullable = false)), 
     @AttributeOverride(name = "photo", column = @Column(name = "photo", nullable = false)), 
     @AttributeOverride(name = "photographDescription", column = @Column(name = "photograph_description", nullable = false, length = 100)) }) 
    public PhotographId getId() { 
     return this.id; 
    } 

//Getters and Setters... 
} 

Это embedable класс для рк:

@Embeddable 
public class PhotographId{ 
    @Column(name = "diagnostic_id", nullable = false) 
    private Long diagnosticId; 
    @Column(name = "photo", nullable = false) 
    private byte[] photo; 
    @Column(name = "photograph_description", nullable = false, length = 100) 
    private String photographDescription; 

//Getters and Setters... 
} 

можно хранить все изображения в базе данных без проблем. Проблема заключается в том, когда я хочу, чтобы показать их в р: DataTable так:

<p:dataTable id="dataTableLoadedPhotos" 
       value="#{imageController.photographListUpdate}" var="image"> 
       <p:column headerText="Fotografías cargadas" width="110"> 
        <o:graphicImage value="#{imageStreamer.getById(image.id)}" 
         alt="#{msgs['label.diagnostic.photograph.notFound']}" /> 
       </p:column> 
      </p:dataTable> 

Я использую косу, основанный на The BalusC Code: ImageServlet и я пытался использовать o:graphicImage без успеха, то не хватает в ми код:

@ManagedBean 
@ApplicationScoped 
public class ImageStreamer { 

@EJB 
private PhotographService photographService; 

public byte[] getById(PhotographId id) { 
    try { 
     return photographService.getContent(id); 
    } catch (ServiceException e) { 
     FacesMessage mensaje = new FacesMessage(
       FacesMessage.SEVERITY_ERROR, 
       "Error al buscar la fotografía " 
         + id.getPhotographDescription(), e.getMessage()); 
     FacesContext.getCurrentInstance().addMessage(null, mensaje); 
    } 
    return null; 
} 
} 

у меня также есть управляемый компонент с @RequestScoped:

@ManagedBean 
@RequestScoped 
public class ImageController { 

@EJB 
private PhotographService photographService; 

@ManagedProperty(value = "#{diagnosticDataManager}") 
private DiagnosticDataManager diagnosticDataManager; 

private List<Photograph> photographListUpdate = new ArrayList<Photograph>(); 
private Photograph selectedPhoto; 

/** 
* 
*/ 
public ImageController() { 
    diagnosticDataManager = new DiagnosticDataManager(); 
} 

@PostConstruct 
public void init() { 
    if (diagnosticDataManager.getDiagnostic().getDiagnosticId() != null) 
     photographListUpdate = photographService 
       .findPhotosByDiagnostic(diagnosticDataManager 
         .getDiagnostic()); 

    for (Photograph photograph : photographListUpdate) { 
     byte[] imageContent = org.apache.commons.codec.binary.Base64 
       .decodeBase64(photograph.getId().getPhoto()); 
     ExternalContext ec = FacesContext.getCurrentInstance() 
       .getExternalContext(); 
     ec.getSessionMap() 
       .put(photograph.getId().toString(), 
         imageContent); 
    } 
} 
// Getters and setters.... 
} 

Как я использую Maven, у меня есть мое приложение каталог, как это:

src 
|----main 
    |----webapp 
      |----images 

У меня есть ошибка в моем server.log, и я не могу увидеть изображение на странице, что отсутствует в моем код?

20:22:43,687 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/patientdiagnostics].[Faces Servlet]] (http-localhost/127.0.0.1:8080-1) JBWEB000236: Servlet.service() for servlet Faces Servlet threw exception: java.lang.IllegalArgumentException: argument type mismatch 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_79] 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_79] 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_79] 
at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_79] 
at org.omnifaces.resourcehandler.GraphicResource.getInputStream(GraphicResource.java:241) [omnifaces-2.0.jar:2.0] 
at com.sun.faces.application.resource.ResourceHandlerImpl.handleResourceRequest(ResourceHandlerImpl.java:260) [jsf-impl-2.1.28.redhat-3.jar:2.1.28.redhat-3] 
at javax.faces.application.ResourceHandlerWrapper.handleResourceRequest(ResourceHandlerWrapper.java:125) [jboss-jsf-api_2.1_spec-2.1.28.Final-redhat-1.jar:2.1.28.Final-redhat-1] 
at org.primefaces.application.resource.PrimeResourceHandler.handleResourceRequest(PrimeResourceHandler.java:74) [primefaces-5.1.jar:5.1] 
at javax.faces.application.ResourceHandlerWrapper.handleResourceRequest(ResourceHandlerWrapper.java:125) [jboss-jsf-api_2.1_spec-2.1.28.Final-redhat-1.jar:2.1.28.Final-redhat-1] 
at javax.faces.application.ResourceHandlerWrapper.handleResourceRequest(ResourceHandlerWrapper.java:125) [jboss-jsf-api_2.1_spec-2.1.28.Final-redhat-1.jar:2.1.28.Final-redhat-1] 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:591) [jboss-jsf-api_2.1_spec-2.1.28.Final-redhat-1.jar:2.1.28.Final-redhat-1] 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295) [jbossweb-7.4.8.Final-redhat-4.jar:7.4.8.Final-redhat-4] 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) [jbossweb-7.4.8.Final-redhat-4.jar:7.4.8.Final-redhat-4] 
at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:105) [primefaces-5.1.jar:5.1] 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246) [jbossweb-7.4.8.Final-redhat-4.jar:7.4.8.Final-redhat-4] 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) [jbossweb-7.4.8.Final-redhat-4.jar:7.4.8.Final-redhat-4] 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:231) [jbossweb-7.4.8.Final-redhat-4.jar:7.4.8.Final-redhat-4] 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149) [jbossweb-7.4.8.Final-redhat-4.jar:7.4.8.Final-redhat-4] 
at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.4.0.Final-redhat-19.jar:7.4.0.Final-redhat-19] 
at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.4.0.Final-redhat-19.jar:7.4.0.Final-redhat-19] 
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) [jboss-as-web-7.4.0.Final-redhat-19.jar:7.4.0.Final-redhat-19] 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145) [jbossweb-7.4.8.Final-redhat-4.jar:7.4.8.Final-redhat-4] 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) [jbossweb-7.4.8.Final-redhat-4.jar:7.4.8.Final-redhat-4] 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) [jbossweb-7.4.8.Final-redhat-4.jar:7.4.8.Final-redhat-4] 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) [jbossweb-7.4.8.Final-redhat-4.jar:7.4.8.Final-redhat-4] 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856) [jbossweb-7.4.8.Final-redhat-4.jar:7.4.8.Final-redhat-4] 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653) [jbossweb-7.4.8.Final-redhat-4.jar:7.4.8.Final-redhat-4] 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:926) [jbossweb-7.4.8.Final-redhat-4.jar:7.4.8.Final-redhat-4] 
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_79] 

я пытался что-то похожее на Display database blob images in <p:graphicImage> inside <ui:repeat>

ответ

0

Как указано в documentation и showcase,

В случае свойство является выражение метод принимает аргументы, каждый из этих аргументов будут преобразованы к параметру HTTP-запроса строки и обратно к реальным объектам с использованием конверторов, зарегистрированных по классу, как доступно через Application.createConverter(Class). Таким образом, большинство стандартных типов, таких как Long, уже неявно поддерживаются. Если вам по какой-то причине вам нужно предоставить настраиваемый объект в качестве аргумента, вам необходимо явно зарегистрировать конвертер для него самостоятельно через @FacesConverter(forClass).

<o:graphicImage> преобразует все аргументы метода EL в строку и обратно с использованием JSF-преобразователей, зарегистрированных для класса типа аргумента. JSF уже имеет встроенные преобразователи, например. Long типа, поэтому они выстраивают коробку. Но у вас есть тип PhotographId как аргумент метода EL и, по-видимому, для него не зарегистрирован JSF-конвертер.

Вы имеете 2 варианта:

  1. Не поставлять весь объект в качестве аргумента. Вместо этого используйте свой идентификатор, который находится в вашем случае только Long.

    E.g.

    <o:graphicImage value="#{imageStreamer.getById(image.id.diagnosticId)}"> 
    

    И соответствующим образом измените способ getById().

  2. Создайте конвертер JSF для класса PhotographId.

    @FacesConverter(forClass=PhotographId.class) 
    public class PhotographIdConverter implements Converter { 
    
        @Override 
        public String getAsString(FacesContext context, UIComponent component, Object modelValue) { 
         // Write code here which converts PhotographId to its unique String representation. 
        } 
    
        @Override 
        public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) { 
         // Write code here which coverts the PhotographId's unique String representation as created in above method back to the original PhotographId object. 
        } 
    
    } 
    

Тем не менее, модель выглядит странно. Содержание фотографии является частью составного ключа .. ?? Это очень неэффективно как на стороне SQL, так и на Java. Вы могли бы также просмотреть его и зафиксировать (и тогда вам нужно будет соответственно изменить использование <o:graphicImage>).

Кроме того, это сообщение, которое вы пытаетесь добавить в блок catch стримера, нигде не отображается, так как запрос изображения не представляет собой страницу JSF. Вам лучше просто зарегистрировать/отправить его по почте.

+0

Спасибо за ваше предложение, ошибка, которую у меня была до этого, исчезла, потому что я использовал опцию 1. Я создал Long id как атрибут, но пока не могу посмотреть изображение. Что может быть моей ошибкой? (PD: Я новичок здесь, поэтому, я думаю, я ошибся, отредактировав свой прежний вопрос, на который вы ответили, извините) –

+0

. Вы действительно должны задать новый вопрос, поскольку ваша первоначальная проблема была решена. Измененный вопрос теперь дал ответ запутанным и бесполезным для будущих читателей, поскольку он конкретно не отвечает на вопрос в его нынешней форме вообще. Такое поведение повторного использования/редактирования существующих вопросов, чтобы спросить о чем-то совершенно другом, называется «хамелеонизирующим» и считается очень грубым. Лучше не делать этого, так как ответчик будет очень заманчивым просто удалить ответ и игнорировать ваши будущие вопросы. В истории изменений вы можете найти ссылку возврата. – BalusC

+0

Спасибо за ваше терпение, я вернулся к первому вопросу, и я собираюсь задать свою новую проблему в другом посте, я отмечаю это как разрешенное –