2016-02-17 3 views
0

У меня есть JSP-страница, использующая JPA-REST в фоновом режиме, мне удалось вставить blob в базу данных. Теперь я хочу иметь возможность получить retrieve/GET blob из базы данных, но я не могу найти примеров того, как это сделать через Jersey вместо использования сервлетов (я довольно новичок в создании собственного REST Сервисы).Извлечь Blob (pdf) из базы данных с помощью JPA, Jersey

Это код, который я использовал для Вставка сгустков в базу данных:

@POST 
@Path("upload/{id}") 
@Consumes({"application/x-www-form-urlencoded", "multipart/form-data"}) 
public void addBlob(@PathParam("id") Integer id, @FormDataParam("file") InputStream uploadedInputStream) throws IOException { 
    ClientCaseDoc entityToMerge = find(id); 
    try { 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     int read = 0; 
     byte[] bytes = new byte[1024]; 
     while ((read = uploadedInputStream.read(bytes)) != -1) { 
      out.write(bytes, 0, read); 
     } 
     entityToMerge.setDocument(out.toByteArray()); 
     super.edit(entityToMerge); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Есть ли какой-либо подобный способ Получение Капля из базы данных? Или мне нужно использовать сервлеты?

Любая помощь очень ценится.

+0

@ BorisPavlović Я думаю, что ответы на эти вопросы довольно неясно, честно говоря, один из них создал свой собственный класс PDFGenerator, другой создает QRCode как PNG, а еще одна посылка его код, чтобы экспортировать Excel (XLSX) и, как я уже упоминал в своем вопросе, я не использую сервлеты в данный момент. – MattiasH

+0

Конечно, вы используете сервлеты. Любой серверный Java-код, обрабатывающий веб-запрос, является сервлетом. REST упрощает работу, но это еще сервлет. –

+0

@ BorisPavlović Хорошо, спасибо, я узнал что-то новое, теперь .. почему люди создают свои собственные классы сервлетов при использовании REST в этом случае? это не имеет смысла. – MattiasH

ответ

1

Есть ли аналогичный способ извлечения блоба из базы данных? Или мне нужно использовать сервлеты?

Не упоминается в вопросе, я беру это за возвращение BLOB через Jersey, а не с помощью сервлетов. OP, пожалуйста, поправьте меня в комментариях, если я ошибаюсь. Если я прав, вы можете уточнить свой вопрос, чтобы упомянуть Джерси.

Этот вопрос, я думаю, является дубликатом Input and Output binary streams using JERSEY?. Однако, как представляется, комментарии показывают некоторую путаницу в том, как реализовать его в случае OPs. Когда вы загружаете PDF-файлы в модель домена (если это хорошо, я разрешу другим людям спорить), потоковая передача не нужна. Все, что вам нужно сделать, это создать Response с entity, установленным как массив байтов, возвращаемый слоем данных.

@Path("upload/{id}") 
@GET 
public Response getPDF(@PathParam("id") Integer id) throws Exception { 
    ClientCaseDoc entity = find(id); 
    return Response 
      .ok() 
      .type("application/pdf") 
      .entity(entity.getDocument()) // Assumes document is a byte array in the domain object. 
      .build(); 
} 
1

Это уже был дан ответ, но для решения более широкого вопроса;

У меня есть сущность;

@Entity 
public class BlobEntity { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column(name = "NAME") 
    private String name; 

    @Lob 
    @Column(name="DATA", length=100000) 
    private byte[] data; 

JPA хранилище

@Repository 
public interface BlobEntityRepository extends CrudRepository<BlobEntity, Long> { 
} 

И тест, который читает слово документ и извлекает его из базы данных

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:applicationContext-test.xml") 
public class BlobEntitytRepositoryTest extends AbstractTest { 

    @Autowired 
    private BlobEntityRepository repository; 

    @Test 
    @Transactional 
    public void test1() throws IOException { 

     InputStream inputStream = getClass().getResourceAsStream("/HelloGreg.docx"); 
     byte[] byteArray = IOUtils.toByteArray(inputStream); 

     BlobEntity blobEntity = new BlobEntity(); 
     blobEntity.setName("test"); 
     blobEntity.setData(byteArray); 

     repository.save(blobEntity); 

     assertEquals(1, repository.count()); 

     BlobEntity entity = repository.findOne(1l); 
     assertNotNull(entity); 

     FileOutputStream outputStream = new FileOutputStream(new File("testOut.docx")); 
     IOUtils.write(entity.getData(), outputStream); 
    } 

} 

Config

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc" 
    xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:cache="http://www.springframework.org/schema/cache" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
    http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd 
    http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
    http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> 

    <context:component-scan base-package="com.greg" /> 
    <tx:annotation-driven /> 
    <jpa:repositories base-package="com.greg" /> 

    <bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="org.h2.Driver" /> 
     <property name="url" value="jdbc:h2:file:~/data/jpa-test" /> 
     <property name="username" value="sa" /> 
     <property name="password" value="" /> 
    </bean> 

    <bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="packagesToScan" value="com.greg" /> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
     </property> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.hbm2ddl.auto">create</prop> 
       <prop key="hibernate.show_sql">false</prop> 
       <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

</beans> 
+0

Можно ли это сделать без использования Spring и без использования репозитория JPA? Сейчас у меня есть класс Entity, FacadeREST, pom.xml, AbstractFacade, Application Config, JSP-страницы. – MattiasH

+0

Что я хочу сделать в @Path («Download/{id}»), я хочу найти blob, подключенный к этому {id}, и отправить его обратно на страницу JSP в качестве ответа – MattiasH

+0

Вам необходимо использовать JPA (API) и Hibernate (реализация, это очень просто, я добавил конфигурацию пружины –

Смежные вопросы